Jak uzyskać typ MIME pliku mającego swój identyfikator Uri?


85

Mam listę Uris uzyskaną za pomocą Galerii i Aparatu. Te URI są tak: content://media/external/images/media/94. Jak mogę uzyskać jego typ MIME?

Odpowiedzi:


175

Możesz spróbować

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

Edytować :

mime.getExtensionFromMimeType(cR.getType(uri)) 

zwraca -> „jpeg”

cR.getType(uri);

zwraca „image / jpeg”, czyli oczekiwaną wartość.


15
mime.getExtensionFromMimeType(cR.getType(uri))zwraca mnie, "jpeg"ale cR.getType(uri)zwraca, "image/jpeg"że jest to oczekiwana wartość.
Brais Gabin

To nie działa na niektórych urządzeniach… Czy jest jakaś alternatywa?
Aditi Parikh

2
@AditiParikh Ta odpowiedź działa dla mnie ...
Ciekawość

1
@BraisGabin Próbuję czytać w pliku .csv. Z jakiegoś powodu otrzymuję „text / csv” dla, cR.getType(uri)ale ime.getExtensionFromMimeType(cR.getType(uri));otrzymuję wartość null. Czy .csv po prostu nie jest obsługiwany, czy coś?
Justin Liu,

Nie, to nie jest obsługiwane. Możesz zobaczyć listę aktualnie obsługiwanych rozszerzeń w tym kodzie źródłowym .
Brais Gabin

34

Ta metoda zwraca rozszerzenie pliku (jpg, png, pdf, epub itp.).

 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
To działa dla mnie.
Śledziłem

@ Aaron Thanks. Działa doskonale w przypadku nazw plików innych niż angielskie.
Ghasem Sadeghi

12

dla Content Uri.

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

dla File Uri.

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

for Both, działa Contentrównież dla 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;
}

Uważaj na MimeTypeMap.getFileExtensionFromUrl (), wydaje się, że nie jest w stanie obsłużyć wszystkich nazw plików. Na przykład w moim emulatorze zdjęcia zrobione aparatem zawierają przecinki i spacje w nazwie pliku, co powoduje, że ta metoda zwraca pusty ciąg. Zalecam powrót do ręcznego analizowania, jeśli wywołanie metody nie powiodło się (pobierz indeks ostatniego „.” I użyj go do pobrania podciągu)
lbenedetto

8

Zamiast tego:

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

Zrób to:

String type = cR.getType(uri);

A dostaniesz to: image/jpeg.


13
Działa tylko dla content uris (content: //). Nie działa dla pliku uris (file: //)
zyamys

W rzeczywistości ścieżka nie ma znaczenia dla metody getType. Po prostu jest tak, że drugi koniec intencji musi mieć jawnie ustawiony typ intencji. Często tak się nie dzieje w przypadku ścieżek.
Tatarize
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.