在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。
验证输出/捕获任何错误的正确方法是什么?我应该在try / catch块中包装startActivityForResult
吗?我应该尝试捕获哪些类型的异常以及我应该如何处理它们?
答案 0 :(得分:1)
我应该在try / catch块中包装startActivityForResult吗?
是的,虽然这与ACTION_IMAGE_CAPTURE
没有任何关系。用户可能无法访问相机应用程序(例如,用户在共享设备上的受限简档下运行)。只要您使用隐式startActivity()
致电startActivityForResult()
或Intent
,就需要处理没有可用应用的可能性。
我应该尝试捕获的各种类型的异常是什么?我应该如何处理它们?
在您链接的答案中,我指出了相机应用中的崩溃。你不能抓住那些,因为那不是你的应用程序。
超越ActivityNotFoundException
,您还需要考虑Android 6.0运行时权限,因为您需要CAMERA
权限才能启动ACTION_IMAGE_CAPTURE
活动。但通常情况下,这不会涉及异常处理程序。
其他验证不是基于例外情况,而是基于有缺陷的结果:
如果您提供了EXTRA_OUTPUT
,那么您指定的Uri
是否有任何内容?理论上,如果用户没有取消相机应用程序,将会有,但由于相机应用程序错误,这是不可保证的。
如果有内容,是否合理地成为图像文件?例如,您可以使用BitmapFactory
和inJustDecodeBounds
来查看图片是否真的是图片。
如果没有内容,您是否恰好在Uri
的结果Intent
中获得了onActivityResult()
?有缺陷的相机应用程序可能已将图像存储到所需位置并向其提供Uri
,即使这超出了ACTION_IMAGE_CAPTURE
的规范。
如果没有内容且没有Uri
,getExtras("data")
是否会返回非null
值?在这种情况下,你至少有一个缩略图,可以自己保存,即使图像质量可能很糟糕。