How I can get the mime type of a file having its Uri?
Asked Answered
O

7

111

I have a List of Uris obtained with the Gallery and the Camera. These Uris are like this: content://media/external/images/media/94. How I can get its mime type?

Ostrom answered 18/9, 2012 at 9:11 Comment(0)
B
222

You can try

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

Edit :

mime.getExtensionFromMimeType(cR.getType(uri)) 

returns -> "jpeg"

cR.getType(uri);

returns "image/jpeg" that is the expected value.

Brandenbrandenburg answered 18/9, 2012 at 9:19 Comment(6)
mime.getExtensionFromMimeType(cR.getType(uri)) returns me "jpeg" but cR.getType(uri) returns "image/jpeg" that is the expected value.Ostrom
This is not working for some devices..Is there any alternative?Shae
@AditiParikh This answer works for me...Barrios
@BraisGabin I'm trying to read in a .csv file. For some reason I get "text/csv" for cR.getType(uri) but for ime.getExtensionFromMimeType(cR.getType(uri)); I get null. Is .csv just not supported or something?Rohde
No, it's not supported. You can see a list of the currently supported extensions in this source code.Ostrom
How is this the accepted answer when it uses a method that returns extension of the file while OP is asking about the mime type?Manly
C
38

This method returns the extension of the file (jpg, png, pdf, epub etc..).

 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;
}
Cromagnon answered 9/4, 2016 at 9:9 Comment(4)
Its working for me.. I did follow developer.android.com/training/sharing/receive.htmlRefutative
@Cromagnon Thanks. It works perfectly for non-english file names.Modestamodeste
can you explain why u need Uri.fromFile(new File(uri.getPath())) when the method params includes a UriHydrastis
Because I need to parse spaces and special characters i.e space should be %20. Using new File() on the uri path will automatically parse those special characters. If you remove this part, this code will throw an error on file names that have spaces or special charactersCromagnon
S
22

for Content Uri.

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

for File Uri.

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

for Both, works for Content as well as 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;
}
Stature answered 30/3, 2018 at 9:30 Comment(1)
Be careful with MimeTypeMap.getFileExtensionFromUrl(), it seems not to be able to handle all filenames. For example, on my emulator, photos taken with the camera contain commas and spaces in the filename, which causes this method to return an empty String. I recommend falling back to manual parsing if the method call failed (get the index of the last '.' and use it to take the substring)Emit
B
9

Instead of this:

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

Do this:

String type = cR.getType(uri);

And you will get this: image/jpeg.

Blurb answered 28/3, 2013 at 11:5 Comment(2)
Only works for content uris (content://). Doesn't work for file uris (file://)Toodleoo
Actually the path doesn't matter for the getType. It's simply the case that the other end of the intent needs to have explicitly set the type for the intent. Often times this doesn't happen for paths.Wanwand
R
4

Return "image/jpeg" for example

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
    }
}
Robertroberta answered 13/5, 2021 at 4:20 Comment(0)
V
1

I will parrot the answer of Bhavesh with Kotlin extension and return type of okhttp3.MediaType:

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()
    }
}
Vocalic answered 25/4, 2021 at 9:28 Comment(0)
D
1

for kotlin this function will work

fun getMime(uri : Uri, context: Context) : String?{
    val cr = context.contentResolver
    return cr.getType(uri)
}
Done answered 5/7, 2022 at 11:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.