从onActivityResult中识别图库选择的图片还是选择的视频 - Android

6
我正在使用以下代码从图库中选择图像或视频:

我正在使用以下代码从图库中选择图像或视频:

    imgGallery.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent pickPhoto = new Intent(Intent.ACTION_GET_CONTENT);
                    pickPhoto.setType("*/*");
                    String[] mimetypes = {"image/*", "video/*"};
                    pickPhoto.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
                    startActivityForResult(pickPhoto,
                            SELECT_PICTURE_OR_VIDEO);
                }
            });

请注意,我正在使用相同的按钮选择图像或视频。那么当调用onActivityResult时,是否有任何方法可以知道从库中选择了图像还是视频?

你能在onActivityResult中检查MIME类型吗? - Vivek Mishra
@VivekMishra:我一直在找,但是我没在任何地方找到它。 - rahul
3个回答

7

在这里使用其他答案建议的路径并不是做这件事情的最佳方式,因为并不能保证该路径始终包含所有版本的Android设备上的“images / video”这些词语。

相反地,尝试使用Content Resolver来获取MIME类型:

ContentResolver cr = mContext.getContentResolver();
String mime = cr.getType(uri);

您可以像这样使用它。
public void onActivityResult(int requestCode, int resultCode, Intent mediaReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, mediaReturnedIntent);

    Uri selectedMedia = mediaReturnedIntent.getData();
    ContentResolver cr = mContext.getContentResolver();
    String mime = cr.getType(selectedMedia);
    if(mime.toLowerCase().contains("video")) {
        // Do something with the video
    } else if(mime.toLowerCase().contains("image")) {
        // Do something with the image
    }
}

4
您可以使用以下代码进行检查。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && data.getData() != null) {
        String path = data.getData().getPath();
        if (path.contains("/video/")) {
            Log.d(this.getClass().getName(), "Video");
        } else if (path.contains("/images/")) {
            Log.d(this.getClass().getName(), "Image");
        }
    }
}

这一定会起作用,因为我们得到的路径类似于此,我没有找到其他任何东西,这一定会起作用,因为它返回的路径类似于这个 /external/images/media/2928,其中我们不会得到任何重复的数据。因为这里的URI仅包含安卓数据存储中图像的ID。

是的,我有这个想法,但如果图像名称中包含类似“视频”的字符串,那么它将被视为视频,不是吗? - rahul
是的,现在我认为不会有任何问题。但仍然看起来像是一个变通方法。我的意思是我们没有完全可靠的解决方案?例如从数据中获取MIME类型以知道它是图像还是视频。 - rahul
如果你在onActivityResult中调用getExtra方法,你会得到什么?我认为你应该得到mimetype。 - Vivek Mishra
@VivekMishra 它返回了空值。 - Nigam Patro
@Nigam Patro 好的,根据这篇文章,可以使用ContentResolver来实现。这样你就可以确保在任何Android版本上都能获取到MIME类型。 ContentResolver cr = getActivity().getContentResolver(); String mime = cr.getType(uri)现在我可以看到下面的评论也是使用相同的方法来获取MIME类型。 - grayFox16
显示剩余4条评论

0

你可以检测它是图像还是视频。我使用了你的从startActivityForResult代码,并且我能够检测出是否选择了图像或视频。这是我所做的:

public void onClick(View v) {
            Intent pickPhoto = new Intent(Intent.ACTION_GET_CONTENT);
            pickPhoto.setType("*/*");
            String[] mimetypes = {"image/*", "video/*"};
            pickPhoto.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
            startActivityForResult(pickPhoto, 1);

这与你的相同

在OnActivityResult中,我没有添加任何条件。就像这样简单。

    public void onActivityResult(int i,int j, Intent intent) {
        super.onActivityResult(i, j, intent);
}

当我调试意图中的值时,我得到了这个结果: 当图像被选中时

Intent { dat=content://com.android.providers.media.documents/document/image:211660 flg=0x1 }

当选择视频时

Intent { dat=content://com.android.providers.media.documents/document/video:169729 flg=0x1 }

在这里,您可以轻松地识别所选内容,无需任何解决方法。


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