在Android中,如何确定由意图返回的URI的MIME类型?

9

首先解释下我想要达成的目标:

我正在开发一个图片分享应用程序,需要用户从文件系统中选择一张图片。

为此,我正在使用以下代码:

    Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, REQUEST_CODE_IMAGE_PICKER_INTENT);

现在,这将触发一个选择器,在其中我可以看到包括画廊和我手机上的文件管理器应用程序在内的多个选项。如果我选择画廊并从中选择一张图片,那么我的Activity将接收到一个带有图像内容URI的Intent。但是如果我选择文件管理器应用程序,则可以选择任何可能不是图像的文件。因此,我需要能够确定意图返回的URI的MIME类型。意图的getType方法返回null。
有没有办法从返回的意图中确定MIME以确定内容是否为图像。
如果这种方式不起作用,那么我可能需要使用MimeTypeMap来根据文件扩展名确定MIME。
2个回答

24

我找到了一种获取内容URI的MIME类型的方法,但对于其他类型的URI(如'file://.....'形式的URI),没有任何效果。

要获取内容URI的MIME类型 -

    ContentResolver cr = this.getContentResolver();
    String mime = cr.getType(YOUR_CONTENT_URI);

这仅适用于内容 URI。因此,对于其他 URI,我使用 MimeTypeMap 从文件扩展名推断它们的 MIME 类型。


2
我尝试在我的onActivityResult()中做同样的事情,但是getType(data.getData())返回了null。 - Narendra Singh

8
如果您拥有URI,则可以获取mime类型,例如:
Uri uri = Uri.fromFile(file);
ContentResolver cR = context.getContentResolver();
String mime = cR.getType(uri);

或者尝试 // url = 文件路径或任何您想要的适当URL。
public static String getMimeType(String url)
{
    String type = null;
    String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        type = mime.getMimeTypeFromExtension(extension);
    }
    return type;
}

更多详情请参见这些答案


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