Android data.getData() returns 某些手机的 CameraActivity 为空

Android data.getData() returns null from CameraActivity for some phones

我在 Activity 从相机 activity 返回的结果中出现致命错误。让我摸不着头脑的是,错误只发生在少数手机上(基于受影响的用户数量),而大多数人似乎没有任何问题。我可以在我的 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 上提出的一个常见问题,但到目前为止我还没有找到任何对我有帮助的问题。谁能指出我的解决方案并提供答案?

方法启动相机 Activity 结果

@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();
    }
}

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

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

相机应用不需要 return Uri 指向照片,因为那不是 the ACTION_IMAGE_CAPTURE Intent protocol 的一部分。或者:

  • 在你的ACTION_IMAGE_CAPTUREIntent中提供EXTRA_OUTPUT,这样你就知道图像应该存储在哪里,不需要依赖getData(),或

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

您的下一个错误在这里:

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

不要求将图像存储为您可以访问的文件,除非您通过 EXTRA_OUTPUT.

提供到该位置的路径

if(resultCode == RESULT_OK){

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