Як я можу отримати 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.