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?
How I can get the mime type of a file having its Uri?
Asked Answered
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.
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
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;
}
Its working for me.. I did follow developer.android.com/training/sharing/receive.html –
Refutative
@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 Uri –
Hydrastis
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 characters –
Cromagnon
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;
}
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
Instead of this:
String type = mime.getExtensionFromMimeType(cR.getType(uri));
Do this:
String type = cR.getType(uri);
And you will get this: image/jpeg
.
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
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
}
}
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()
}
}
for kotlin this function will work
fun getMime(uri : Uri, context: Context) : String?{
val cr = context.contentResolver
return cr.getType(uri)
}
© 2022 - 2024 — McMap. All rights reserved.
mime.getExtensionFromMimeType(cR.getType(uri))
returns me"jpeg"
butcR.getType(uri)
returns"image/jpeg"
that is the expected value. – Ostrom