在 Android 中,可以通过此基本设置来完成拍照,如 here 所示。 .
protected void dispatchTakePictureIntent(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
...
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
//do stuff with the output file
}
}
但是,third-party camera apps are unpredictable and cannot be guaranteed to play nice .
验证输出/捕获任何错误的正确方法是什么?我应该将 startActivityForResult
包装在 try/catch block 内吗?我应该 try catch 哪些类型的异常以及我应该如何处理它们?
最佳答案
Should I be wrapping startActivityForResult inside of a try/catch block?
是的,尽管这与 ACTION_IMAGE_CAPTURE
无关具体来说。用户可能无权访问相机应用程序(例如,用户在共享设备上的受限配置文件下运行)。随时调用startActivity()
或startActivityForResult()
隐含 Intent
,您需要处理没有可用应用程序的可能性。
What are the various types of exceptions I should be trying to catch and what should I do with them?
在您链接到的答案中,我指出相机应用程序中的崩溃。您无法捕捉到这些,因为那不是您的应用程序。
超越ActivityNotFoundException
,您还需要考虑 Android 6.0 运行时权限,因为您需要 CAMERA
允许启动 ACTION_IMAGE_CAPTURE
Activity 。不过,通常这不会涉及异常处理程序。
其他验证不是基于异常,而是基于有缺陷的结果:
如果您提供
EXTRA_OUTPUT
,Uri
有什么内容吗?你指定了吗?理论上,如果用户没有取消退出相机应用程序,由于相机应用程序的错误,一定会退出,但不能保证。如果有内容,它可能是图像文件吗?例如,您可以使用
BitmapFactory
与inJustDecodeBounds
看看图像是否真的是图像。如果没有内容,你是否碰巧得到了
Uri
返回结果Intent
在onActivityResult()
? buggy 相机应用程序可能已将图像存储在它想要的位置并提供Uri
对此,即使这超出了ACTION_IMAGE_CAPTURE
的规范.如果没有内容,则没有
Uri
,getExtras("data")
返回非null
值(value)?在这种情况下,您至少可以获得缩略图并可以自己保存,即使图像质量可能很差。
关于java - 使用 ACTION_IMAGE_CAPTURE Intent 时如何正确捕获 Android 相机 Activity 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36552921/