使用ACTION_IMAGE_CAPTURE意图

时间:2016-04-11 15:26:49

标签: java android android-intent error-handling android-camera

在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吗?我应该尝试捕获哪些类型的异常以及我应该如何处理它们?

1 个答案:

答案 0 :(得分:1)

  

我应该在try / catch块中包装startActivityForResult吗?

是的,虽然这与ACTION_IMAGE_CAPTURE没有任何关系。用户可能无法访问相机应用程序(例如,用户在共享设备上的受限简档下运行)。只要您使用隐式startActivity()致电startActivityForResult()Intent,就需要处理没有可用应用的可能性。

  

我应该尝试捕获的各种类型的异常是什么?我应该如何处理它们?

在您链接的答案中,我指出了相机应用中的崩溃。你不能抓住那些,因为那不是你的应用程序。

超越ActivityNotFoundException,您还需要考虑Android 6.0运行时权限,因为您需要CAMERA权限才能启动ACTION_IMAGE_CAPTURE活动。但通常情况下,这不会涉及异常处理程序。

其他验证不是基于例外情况,而是基于有缺陷的结果:

  • 如果您提供了EXTRA_OUTPUT,那么您指定的Uri是否有任何内容?理论上,如果用户没有取消相机应用程序,将会有,但由于相机应用程序错误,这是不可保证的。

  • 如果有内容,是否合理地成为图像文件?例如,您可以使用BitmapFactoryinJustDecodeBounds来查看图片是否真的是图片。

  • 如果没有内容,您是否恰好在Uri的结果Intent中获得了onActivityResult()?有缺陷的相机应用程序可能已将图像存储到所需位置并向其提供Uri,即使这超出了ACTION_IMAGE_CAPTURE的规范。

  • 如果没有内容且没有UrigetExtras("data")是否会返回非null值?在这种情况下,你至少有一个缩略图,可以自己保存,即使图像质量可能很糟糕。