我想写一个活动:
是否有适用于每台设备的完整示例?链接到一个简单的开源应用程序拍照将是理想的答案.
我的研究到目前为止:
这是一个常见的场景,有很多问题和教程.
主要有两种方法:
方法1本来是完美的,但问题是每个设备上的意图实现不同. 在某些设备上它运作良好.但是,在某些设备上,您可以拍照,但它永远不会返回到您的应用.在某些设备上,启动意图时没有任何反应.通常它还将图像保存到SD卡,并且需要存在SD卡.每个设备上的用户交互也不同.
方法2的问题是稳定性.我尝试了一些例子,但我设法阻止相机在某些设备上工作(直到重启)并完全冻结另一台设备.在另一台设备上捕捉工作,但预览保持黑色.
我会使用ZXing作为示例应用程序(我经常使用它),但它只使用预览(取景器),并且不拍任何照片.我还发现,在某些设备上,ZXing在光照条件改变时没有自动调整白平衡,而原生相机应用程序正确地做到了(不确定是否可以修复).
更新:
有一段时间我直接使用了相机API.这提供了更多控制(自定义UI等),但我不建议任何人.我会在90%的设备上工作,但是每次都会发布一个新的设备,但是会遇到不同的问题.
我遇到的一些问题:
所以一般来说,除非没有别的办法,否则我不建议去这条路线.两年后,我通过自定义代码转储并切换回基于Intent的方法.从那时起,我的麻烦就少了很多.我过去在基于意图的方法中遇到的问题可能只是我自己的无能.
如果你真的需要走这条路,我听说如果你只支持Android 4.0+的设备会更容易.
我正在使用相机意图拍摄照片.这是我的代码,效果很好:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
我的onActivityResult看起来像这样:
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap photo = (Bitmap) extras.get("data");
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,虽然相机拍摄的照片是480*800(我正在使用HTC Desire),但返回的位图只有194*324!
知道为什么会这样,以及如何解决它?
谢谢!
伙计,当我发送要求拍摄照片的意图时,我仍然无法保存图片.这就是我在做的事情:
创建一个表示路径名的URI
android.content.Context c = getApplicationContext();
String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg";
java.io.File file = new java.io.File( fname );
Uri fileUri = Uri.fromFile(file);
Run Code Online (Sandbox Code Playgroud)创建Intent(不要忘记pkg名称!)并启动活动
private static int TAKE_PICTURE = 22;
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult( intent, TAKE_PICTURE );
Run Code Online (Sandbox Code Playgroud)相机活动开始,我可以拍照,并批准它.我onActivityResult()被召唤了.但我的文件没有写.URI为:file:///data/data/com.droidstogo.boom1/files/parked.jpg
我可以创建缩略图OK(通过不将额外的内容放入Intent),并且可以将该文件写入OK,然后再将其读回来).
任何人都可以看到我犯的是什么简单的错误?在logcat中没有任何明显的东西 - 相机显然正在拍照.谢谢,
彼得
我应该提一下,我在AndroidManifest.xml文件中设置了相应的权限:
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-library android:name="com.google.android.maps" />
</application>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?关于要尝试的事情的任何想法,以获得有关该问题的更多信息?
我正在使用手机的相机并使用android.provider.MediaStore.ACTION_IMAGE_CAPTURE从我的应用程序中捕获图像.
单击捕获按钮后,它会显示保存或丢弃.单击保存按钮,它将返回相机而不是应用程序.并且图像保存在gallary中而不是我声明的输出文件中.
以下是我的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent in=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(in, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode==RESULT_OK) {
Bitmap bm=(Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
//you can create a new file name "test.jpg" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "player1.jpg");
try {
f.createNewFile();
} catch (IOException e) …Run Code Online (Sandbox Code Playgroud) 使用默认相机应用程序的照片和视频保存在SD卡上.
我真的需要知道是否有方法(简单或困难)更改路径,以便我可以将这些文件保存在内部存储器中.
或者,如果您知道来自Android市场的另一个相机应用程序,可以选择更改路径.
我不需要SD卡解决方案.