【问题标题】:Android data.getData() returns null from CameraActivity for some phones对于某些手机,Android data.getData() 从 CameraActivity 返回 null
【发布时间】:2015-09-04 17:07:33
【问题描述】:

我的 onActivityResult 从相机活动返回时发生致命错误。让我摸不着头脑的是,该错误仅发生在少数手机上(基于受影响用户的数量),而对大多数人来说似乎没有任何问题。我可以在我的 Nexus 6(运行 Lollipop 5.1.1)上复制错误,而我的 Note 5(也是 5.1.1)完全没有问题。

问题是当我尝试从 data.getData() 分配 imageUri 时。在 Note 5 上进行调试,data.mData 等于“content://media/external/images/media/2215”,而在 Nexus 6 上,data.mData 为空。

我知道这是在 SO 上提出的一个常见问题,但到目前为止我还没有找到任何对我有帮助的东西。谁能指出我的解决方案并提供答案?

方法为结果启动相机活动

@OnClick(R.id.change_image_camera) public void takePicture(){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}

onActvityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {

        Uri imageUri = data.getData(); //The trouble is here

        String realPath = Image.getPath(this, imageUri); //getPath crashes because imageUri is null

        Image.compressImage(realPath);

        File file = new File(realPath);

        Bundle extra = new Bundle();
        extra.putString("URL", realPath);
        returnIntent.putExtras(extra);

        setResult(RESULT_OK, returnIntent);
        finish();
    }
}

非常感谢您对此提供的任何帮助!

【问题讨论】:

    标签: android null uri


    【解决方案1】:
    Uri imageUri = data.getData(); //The trouble is here
    

    相机应用不需要返回指向照片的Uri,因为它不属于the ACTION_IMAGE_CAPTURE Intent protocol。要么:

    • 在你的ACTION_IMAGE_CAPTUREIntent中提供EXTRA_OUTPUT,在这种情况下你知道图像应该存储在哪里,并且不需要依赖getData(),或者

    • 在响应Intent 中使用额外的data,这将是图像缩略图的Bitmap

    您的下一个错误在这里:

    String realPath = Image.getPath(this, imageUri);
    

    不要求将图像存储为您可以访问的文件,除非您通过EXTRA_OUTPUT 提供该位置的路径。

    【讨论】:

    • 感谢您的快速回复。我根据您的建议提供了 EXTRA_OUTPUT 并完全避免了这些问题
    • @JohnRiggs:请注意,偶尔会有错误的相机应用程序忽略EXTRA_OUTPUT 并且 不返回Uri。除了检测到您没有拍到照片并告诉用户获取真正的相机应用程序之外,您无能为力。 :-)
    【解决方案2】:

    if(resultCode == RESULT_OK){

                    Bitmap bitmap = (Bitmap) imageReturnedIntent.getExtras().get("data");
                    imageView.setImageBitmap(bitmap);
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2011-06-03
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多