在拍照后的onActivityResult中获取图片Uri?

24

我有这段代码:

startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), CAMERA_IMAGE);

这允许用户拍照。现在我该如何在onActivityResult中获取那张照片的URI呢?是通过Intent额外信息吗?还是通过Intent.getData()实现?

4个回答

34
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
    Uri u = intent.getData();
}

顺便提一下... 在某些设备上,该意图存在一个错误。查看此答案了解如何解决它。


谢谢你提供的解决方法。那正是我遇到的主要问题。 - Mohit Deshpande
2
当在Android 4.4中运行代码时,它无法工作。Uri u为空。 - user798719
3
Uri u = intent.getData(); 这是来自"data"的缩略图。要处理全尺寸的图像需要更多工作。 - sky91
有最近的版本吗?因为它给我显示了一个错误。 - Abdennacer Lachiheb

9

除了启动意图,还要确保告诉意图你想要的照片放在哪里。

Uri uri = Uri.parse("file://somewhere_that_you_choose");
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
photoIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(photoIntent, CAMERA_IMAGE);

当你收到onActivityResult()方法的调用时,如果它是成功的,就打开一个流到URI,然后一切都应该设置好了。


4
这种方法的问题在于在许多设备上,图像会同时存储在由EXTRA_OUTPUT额外参数指定的位置和相册中。我个人曾在几款HTC和LG设备上看到过这种情况,但我知道还有其他设备也存在同样的问题... - Justin
1
我认为你对相册的工作方式存在误解。如果你不在某个时刻删除照片,那么它将出现在你手机相册中,就像另一张照片一样。如果你将EXTRA_OUTPUT的bundle值设置为一个有你访问权限且其中有一个名为“.nomedia”的空文件的沙盒文件夹,那么相册就不会扫描输出内容。 - Greg Giacovelli
看这里...它解释了问题,并且还有一个链接到错误跟踪器中的错误:https://dev59.com/YXI-5IYBdhLWcg3wVWti - Justin
你链接的错误与双重捕获问题无关,而是涉及到捕获图像大小的问题。无论如何,使用和不使用EXTRA_OUTPUT都可以工作。没有EXTRA_OUTPUT的getData()只是一个低分辨率照片(通常是缩略图大小),而EXTRA_OUTPUT从来没有全分辨率,但通常更高。早期手机/操作系统版本存在更多问题,但我在最近的手机/版本中没有看到太多这些问题。 - Greg Giacovelli
1
是的...看着我的链接,那是错误的帖子。我很难再找到那篇帖子了。但我仍然在我的LG手机和HTC手机上测试过,并得到了我提到的结果。 - Justin
显示剩余2条评论

2
Uri uri = null;
if(requestCode == GALLERY_INTENT && resultCode == RESULT_OK){
  uri = data.getData();
}

0
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {

          Bitmap photo = (Bitmap) data.getExtras().get("data");
          Uri fileUri = Utils.getUri(getActivity(), photo);
    }  
}

public String getRealPathFromURI (Uri contentUri) {
    String path = null;
    String[] proj = { MediaStore.MediaColumns.DATA };
    Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
        path = cursor.getString(column_index);
    }
    cursor.close();
    return path;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接