Как я могу получить MIME-тип файла с его Uri?

86

У меня есть список Uris, полученный с помощью галереи и камеры. Эти Юрис, как это: content://media/external/images/media/94. Как я могу получить его пантомиму?

Брайс Габен
источник

Ответы:

181

Ты можешь попробовать

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

Редактировать :

mime.getExtensionFromMimeType(cR.getType(uri)) 

возвращает -> "jpeg"

cR.getType(uri);

возвращает "изображение / JPEG", которое является ожидаемым значением.

Картик Домадия
источник
15
mime.getExtensionFromMimeType(cR.getType(uri))возвращает меня, "jpeg"но cR.getType(uri)возвращает "image/jpeg"ожидаемое значение.
Brais Gabin
На некоторых устройствах это не работает .. Есть ли альтернатива?
Адити Парих
2
@AditiParikh Этот ответ работает для меня ...
Любопытство
1
@BraisGabin Я пытаюсь прочитать файл .csv. По какой-то причине я получаю "text / csv", cR.getType(uri)но для ime.getExtensionFromMimeType(cR.getType(uri));меня - null. CSV просто не поддерживается или что-то в этом роде?
Джастин Лю
Нет, не поддерживается. Вы можете увидеть список поддерживаемых в настоящее время расширений в этом исходном коде .
Брайс Габен
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;
}
Аарон
источник
2
Это работает на меня .. Я
подписался на
@Aaron Спасибо. Он отлично работает с неанглийскими именами файлов.
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());

для обоих работает 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;
}
Бхавеш Рангани
источник
Будьте осторожны с MimeTypeMap.getFileExtensionFromUrl (), похоже, он не может обрабатывать все имена файлов. Например, в моем эмуляторе фотографии, сделанные камерой, содержат запятые и пробелы в имени файла, из-за чего этот метод возвращает пустую строку. Я рекомендую вернуться к ручному синтаксическому анализу, если вызов метода завершился неудачно (получить индекс последнего '.' И использовать его для получения подстроки)
lbenedetto
8

Вместо этого:

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

Сделай это:

String type = cR.getType(uri);

И вы получите это: image/jpeg.

Мохамед Ибрагим
источник
13
Работает только для содержимого uris (content: //). Не работает для файла uris (file: //)
zyamys
На самом деле путь не имеет значения для getType. Это просто случай, когда другой конец намерения должен явно установить тип для намерения. Часто этого не происходит с путями.
Tatarize