【问题标题】:How to properly error-catch Android camera activity when using the ACTION_IMAGE_CAPTURE Intent使用 ACTION_IMAGE_CAPTURE Intent 时如何正确捕获 Android 相机活动
【发布时间】:2016-04-11 15:26:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    是的,尽管这与ACTION_IMAGE_CAPTURE 无关。用户可能无权访问相机应用程序(例如,用户在共享设备上的受限配置文件下运行)。每当您使用隐式 Intent 调用 startActivity()startActivityForResult() 时,您都需要处理没有可用应用程序的可能性。

    我应该尝试捕获哪些不同类型的异常以及我应该如何处理它们?

    在您链接到的答案中,我指出了相机应用程序中的崩溃。你无法捕捉到那些,因为那不是你的应用。

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

    其他验证不是基于异常,而是基于有缺陷的结果:

    • 如果您提供了EXTRA_OUTPUT,您指定的Uri 是否有任何内容?理论上,如果用户没有取消退出相机应用程序,则会有,但不能保证,因为相机应用程序错误。

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

    • 如果没有内容,您是否碰巧在onActivityResult() 的结果Intent 中返回了Uri?有问题的相机应用程序可能已将图像存储在它想要的位置并为其提供了Uri,尽管这超出了ACTION_IMAGE_CAPTURE 的规范。

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

    【讨论】:

    • 关于可能的Uri back in the result Intent,我还不熟悉Uri 的用法,但根据我刚才的谷歌搜索,你是说检查Uri myUri = Uri.parse(data.getExtras().getString(MediaStore.EXTRA_OUTPUT)); 之类的东西是否给出Uri 包含file: 类型?
    • @KaliMa:不,我的意思是如果Intent 上的getData() 交给onActivityResult() 会返回Uri。我想相机应用程序可以通过onActivityResult() 向您发送一个Intent 和一个EXTRA_OUTPUT 额外的onActivityResult() 并不是不可能的,但我还没有听说过这种情况。我听说过相机应用程序会将Uri 作为Uri 本身的Uri 发送回来。
    • 但是如果我指定了takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); ,难道我不知道生成的图片文件将在onActivityResult() 中的什么位置吗?还是有些应用完全忽略了这一点并将其放在任何他们想要的地方?
    • @KaliMa:“我不知道生成的图片文件会在哪里”——理论上是的。 “或者某些应用程序是否完全忽略了这一点并将其放在任何他们想要的地方?” -- 是的,因为一些ACTION_IMAGE_CAPTURE 实现有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多