Як я можу отримати mime-тип файлу з його Uri?


85

У мене є список Uris, отриманий за допомогою галереї та камери. Ці Юріс, як це: content://media/external/images/media/94. Як я можу отримати його тип mime?

Відповіді:


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"очікуване значення.
Брайс Габін,

Це не працює для деяких пристроїв .. Чи існує якась альтернатива?
Адіті Паріх,

2
@AditiParikh Ця відповідь працює для мене ...
Curiousity

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

2
Це працює для мене .. Я наслідував developer.android.com/training/sharing/receive.html
amitabha2715

@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 (файл: //)
zyamys

Насправді шлях не має значення для getType. Це просто той випадок, що інший кінець наміру повинен явно встановити тип наміру. Часто це трапляється не для доріжок.
Татарізувати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.