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

时间:2012-09-18 09:11:44

标签: android uri mime-types

我有一张使用图库和相机获得的Uris列表。这些Uris是这样的:content://media/external/images/media/94。我怎么能得到它的mime类型?

6 个答案:

答案 0 :(得分:148)

你可以尝试

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”。

答案 1 :(得分:26)

此方法返回文件的扩展名(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;
}

答案 2 :(得分:8)

而不是:

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

这样做:

String type = cR.getType(uri);

你会得到这个:image/jpeg

答案 3 :(得分:5)

代表Content Uri

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

代表File Uri

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

for Both适用于Content以及File

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;
}

答案 4 :(得分:0)

我将使用 Kotlin 扩展和 okhttp3.MediaType 的返回类型来模仿 Bhavesh 的答案:

fun Uri.mimeType(contentResolver: ContentResolver)
        : MediaType? {
    if (scheme.equals(ContentResolver.SCHEME_CONTENT)) {
        // get (image/jpeg, video/mp4) from ContentResolver if uri scheme is "content://"
        return contentResolver.getType(this)?.toMediaTypeOrNull()
    } else {
        // get (.jpeg, .mp4) from uri "file://example/example.mp4"
        val fileExtension = MimeTypeMap.getFileExtensionFromUrl(toString())
        // turn ".mp4" into "video/mp4"
        return MimeTypeMap.getSingleton()
                .getMimeTypeFromExtension(fileExtension.toLowerCase(Locale.US))
                ?.toMediaTypeOrNull()
    }
}

答案 5 :(得分:0)

例如返回“image/jpeg”

fun Uri.getMimeType(context: Context): String? {
    return when (scheme) {
        ContentResolver.SCHEME_CONTENT -> context.contentResolver.getType(this)
        ContentResolver.SCHEME_FILE -> MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            MimeTypeMap.getFileExtensionFromUrl(toString()).toLowerCase(Locale.US)
        )
        else -> null
    }
}