java - 使用 ACTION_IMAGE_CAPTURE Intent 时如何正确捕获 Android 相机 Activity 的错误

标签 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 .

验证输出/捕获任何错误的正确方法是什么?我应该将 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_OUTPUTUri有什么内容吗?你指定了吗?理论上,如果用户没有取消退出相机应用程序,由于相机应用程序的错误,一定会退出,但不能保证。

  • 如果有内容,它可能是图像文件吗?例如,您可以使用 BitmapFactoryinJustDecodeBounds看看图像是否真的是图像。

  • 如果没有内容,你是否碰巧得到了Uri返回结果IntentonActivityResult() ? buggy 相机应用程序可能已将图像存储在它想要的位置并提供 Uri对此,即使这超出了 ACTION_IMAGE_CAPTURE 的规范.

  • 如果没有内容,则没有UrigetExtras("data")返回非 null值(value)?在这种情况下,您至少可以获得缩略图并可以自己保存,即使图像质量可能很差。

关于java - 使用 ACTION_IMAGE_CAPTURE Intent 时如何正确捕获 Android 相机 Activity 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36552921/

相关文章:

java - java维护栈的算法

java - printf 方法不起作用

android - 使用android的蓝牙 Remote

android - 2.1 上的传感器模拟器

android - 通过Seekable Pipe或Stream与其他Android应用共享?

Android 应用程序检查是否安装了应用程序来读取不同类型的文件(如 pdf、docx、pptx、txt、rtf)等

java - 无法使用线程获得正确的结果

java - 是否可以检测来自另一个项目的实体?

java - 尝试从 json 字符串获取数据时出现异常

java - Android Studio - 非法字符 8204 错误