如何获得具有Uri的文件的mime类型?


85

我有一个通过画廊和相机获得的Uris清单。这些Uris是这样的:content://media/external/images/media/94。如何获得它的mime类型?

Answers:


175

你可以试试

ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(uri));

编辑:

mime.getExtensionFromMimeType(cR.getType(uri)) 

返回->“ jpeg”

cR.getType(uri);

返回期望值的“ image / jpeg”。


15
mime.getExtensionFromMimeType(cR.getType(uri))返回我,"jpeg"cR.getType(uri)返回的"image/jpeg"是期望值。
Brais Gabin 2012年

这不适用于某些设备。是否有其他选择?
阿迪蒂·帕里克

2
@AditiParikh这个答案 对我的作品...
好奇

1
@BraisGabin我正在尝试读取.csv文件。由于某种原因,我得到了“ text / csv”,cR.getType(uri)但由于ime.getExtensionFromMimeType(cR.getType(uri));我得到了null。是不支持.csv还是其他功能?
贾斯汀·刘

不,不支持。您可以在此源代码中看到当前支持的扩展列表。
Brais Gabin

34

此方法返回文件的扩展名(jpg,png,pdf,epub等。)。

 public static String getMimeType(Context context, Uri uri) {
    String extension;

    //Check uri format to avoid null
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        //If scheme is a content
        final MimeTypeMap mime = MimeTypeMap.getSingleton();
        extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
    } else {
        //If scheme is a File
        //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
        extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());

    }

    return extension;
}


@亚伦谢谢。它非常适合非英语文件名。
Ghasem Sadeghi

12

Content Uri

ContentResolver cr = context.getContentResolver();
mimeType = cr.getType(contentUri);

File Uri

String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri
            .toString());
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            fileExtension.toLowerCase());

对于BothContentFile

public String getMimeType(Context context, Uri uri) {
    String mimeType = null;
    if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
        ContentResolver cr = context.getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

请谨慎使用MimeTypeMap.getFileExtensionFromUrl(),似乎无法处理所有文件名。例如,在我的模拟器上,用相机拍摄的照片的文件名中包含逗号和空格,这将导致此方法返回空字符串。如果方法调用失败(获取最后一个“。”的索引并使用它来获取子字符串),我建议您退回到手动解析
lbenedetto

8

代替这个:

String type = mime.getExtensionFromMimeType(cR.getType(uri));

做这个:

String type = cR.getType(uri);

你会得到这样的:image/jpeg


13
仅适用于内容uri(con​​tent://)。不适用于文件uris(file://)
zyamys '16

实际上,路径对于getType并不重要。在这种情况下,意图的另一端需要显式设置意图的类型。通常情况下,路径不会发生这种情况。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.