1

我的应用程序的一项功能包括相机。用户拍照,应用程序显示图像。

我使用 StartActivityForResult 从 ACTION_IMAGE_CAPTURE 开始一个意图,并使用 onActivityResult 捕获响应。通常我可以简单地根据我在 onActivityResult 中收到的意图调用getData()并获取 MediaProvider 的内容 uri。

我的问题如下:我的一个测试设备是华为 ALE-L21,我在 onActivityResult 中获得的意图没有数据,而是有一个可拆分的额外内容。我怎么能从中得到用户的照片?Android Studio 也没有告诉我这个 parcellable extra 的名称


免责声明:我调用 getActivity() 是因为我在片段中使用此代码


这是我用来拿相机的。

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, getResources().getInteger(R.integer.RQ_PERMISSION_WRITE_EXTERNAL_STORAGE));
}

这是我的 onActivityResult 中的代码

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

    switch (requestCode) {
        case 1: //RQ_ImageCapture
        case 2: //RQ_ImageSelected
            if (resultIntent != null) {
                try {
                    Uri selectedImage = resultIntent.getData();
                    if(selectedImage != null) {
                        Bitmap bitmap = 
                        MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImage);
                        setImageAsBackground(selectedImage, bitmap);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            break;
    }
}
4

1 回答 1

2

通常我可以简单地根据我在 onActivityResult 中收到的意图调用 getData() 并获取 MediaProvider 的内容 uri。

您的代码在其中许多设备上都会失败,包括所有最近的 Nexus 设备。ACTION_IMAGE_CAPTURE不应该返回 a Uri。引用文档

如果 EXTRA_OUTPUT 不存在,则在额外字段中将小尺寸图像作为位图对象返回。这对于只需要小图像的应用程序很有用。如果存在 EXTRA_OUTPUT,则将全尺寸图像写入 EXTRA_OUTPUT 的 Uri 值。

由于您不包括EXTRA_OUTPUT,因此您将获得一个带有缩略图的data额外 ( )。getData().getExtra("data")

我在 onActivityResult 中获得的意图没有数据,但相反,它有一个可分割的额外内容

鉴于您的ACTION_IMAGE_CAPTURE要求,这就是您应该得到的。

如果你想要一个全尺寸的图像,包括EXTRA_OUTPUT,也许指向FileProvider你的应用程序中的一个,例如我在这个示例应用程序中演示的。然后,您知道Uri照片应该去哪里,因为您指定了Uri.

于 2016-08-09T13:18:38.513 回答