Załóżmy, że mam pełną ścieżkę do pliku, taką jak: (/ sdcard / tlogo.png). Chcę poznać jego typ mime.
Stworzyłem dla niego funkcję
public static String getMimeType(File file, Context context)
{
Uri uri = Uri.fromFile(file);
ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(uri));
return type;
}
ale kiedy to nazywam, zwraca wartość null.
File file = new File(filePath);
String fileType=CommonFunctions.getMimeType(file, context);
android
filesystems
mime-types
Sushant Bhatnagar
źródło
źródło
ID3
w początek jego tekstu, by jeszcze bardziej zepsuć z Tobą.*/*
?Wykryj typ MIME dowolnego pliku
źródło
toLowerCase()
załatwił sprawę.apostrophe
! Na przykład. nazwa pliku =Don't go baby.mp3
.PatternMatcher
WewnątrzMimeTypeMap.getFileExtensionFromUrl()
nie może obsłużyć nazwę pliku i zwraca pusty ciąg; null jest ciągiem typu MIME!I. Shvedenenko
Worked dla problemów, które wskazałem powyżej. Ale ta odpowiedź była wskazówką we właściwym kierunku.file://
lubcontent://
.Powyższe rozwiązanie MimeTypeMap zwróciło wartość null w moim użyciu. To działa i jest łatwiejsze:
źródło
Zoptymalizowana wersja odpowiedzi Jensa z typem zerowym i awaryjnym.
Aktualizacja (19.03.2018)
Bonus: powyższe metody jako mniej szczegółowa funkcja rozszerzenia Kotlin :
źródło
toLoverCase
częściowo.źródło
Płacić bardzo baczną uwagę na umerk44 „s rozwiązania powyżej.
getMimeTypeFromExtension
wywołujeguessMimeTypeTypeFromExtension
i rozróżnia wielkość liter. Spędziłem nad tym popołudnie, a potem przyjrzałem się bliżej -getMimeTypeFromExtension
wrócę,NULL
jeśli podasz "JPG", a zwróci "image / jpeg", jeśli podasz "jpg".źródło
Oto rozwiązanie, którego użyłem w mojej aplikacji na Androida:
źródło
Czasami odpowiedzi Jeba i Jensa nie działają i zwracają zero. W tym przypadku korzystam z rozwiązania follow. Nagłówek pliku zwykle zawiera sygnaturę typu. Przeczytałem i porównuję ze znanymi na liście podpisów .
signatureId
jest indeksem podpisu w tablicy podpisów. Na przykład,Teraz mam typ pliku, nawet jeśli nie ma identyfikatora URI pliku. Następnie otrzymuję typ MIME według typu pliku. Jeśli nie wiesz, jaki typ MIME uzyskać, możesz znaleźć odpowiedni w tej tabeli .
Działa dla wielu typów plików. Ale w przypadku wideo to nie działa, ponieważ potrzebujesz znanego kodeka wideo, aby uzyskać typ MIME. Aby uzyskać typ MIME wideo, używam MediaMetadataRetriever .
źródło
Próbowałem użyć standardowych metod do określenia typu MIME, ale nie mogę zachować rozszerzenia pliku za pomocą
MimeTypeMap.getFileExtensionFromUrl(uri.getPath())
. Ta metoda zwróciła mi pusty ciąg. Zrobiłem więc nietrywialne rozwiązanie, aby zachować rozszerzenie pliku.Oto metoda zwracająca rozszerzenie pliku:
Zachowując rozszerzenie pliku, można uzyskać typ MIME, jak poniżej:
źródło
MimeTypeMap.getFileExtensionFromUrl
zwrócił pusty ciąg dla nazw plików, które zawierają nieprawidłowe znaki zgodnie z wewnętrzną implementacją plikuPatternMatcher
. To zadziałało dla mnie całkowicie! Uwielbiałem to, do tej pory żadnych problemów!String extension = file.getName().split("\\.")[1]
również działałby, eliminując w ten sposób metodę getExtension ().MimeTypeMap
może nie rozpoznawać niektórych rozszerzeń plików, takich jak flv, mpeg, 3gpp, cpp. Musisz więc pomyśleć, jak rozszerzyć MimeTypeMap w celu utrzymania kodu. Oto taki przykład.http://grepcode.com/file/repo1.maven.org/maven2/com.google.okhttp/okhttp/20120626/libcore/net/MimeUtils.java#MimeUtils
Dodatkowo, oto pełna lista typów MIME
http: //www.sitepoint.com/web-foundations/mime-types-complete-list/
źródło
Dla platformy Xamarin Android (powyższa odpowiedź z @ HoaLe)
źródło
źródło
źródło
źródło
Miałem podobny problem. Na razie wiem, że wynik może się różnić dla różnych nazw, więc w końcu doszedłem do tego rozwiązania.
źródło
Powyższe rozwiązanie zwróciło wartość null w przypadku pliku .rar, w tym przypadku zadziałało użycie adresu URLConnection.guessContentTypeFromName (url).
źródło
mime z pliku lokalnego:
źródło
masz wielokrotny wybór, aby uzyskać rozszerzenie pliku: jak: 1-
String filename = uri.getLastPathSegment();
Zobacz ten link2-możesz również użyć tego kodu
ale to nie jest dobra aprocha. 3 - jeśli masz URI pliku, użyj tego kodu
4-jeśli masz adres URL, użyj tego kodu:
miłego kodu :)
źródło
źródło
źródło
Zwrócił również wartość null w mojej ścieżce sprawy
jako obejście użycia
tak wygląda metoda
w rezultacie zwraca wynik sukcesu:
Mam nadzieję, że to pomoże każdemu
źródło
Żadna z odpowiedzi tutaj nie jest idealna. Oto odpowiedź łącząca najlepsze elementy ze wszystkich najlepszych odpowiedzi:
źródło
źródło
Uważam, że najłatwiej jest odnieść się do tego pliku zasobów: https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/net/android.mime.types
źródło
Nie zdaję sobie sprawy, dlaczego
MimeTypeMap.getFileExtensionFromUrl()
ma problemy zspace
si kilkoma innymi znakami, które powracają""
, ale właśnie napisałem tę metodę, aby zmienić nazwę pliku na dopuszczalną. To tylko zabawa zString
s. Jednak to trochę działa. W ten sposóbspace
znaki występujące w nazwie pliku są zamieniane na pożądany znak (tutaj jest to „x”),replaceAll(" ", "x")
a inne nieodpowiednie znaki są zamieniane na odpowiedni znak za pomocąURLEncoder
. więc użycie (zgodnie z kodami przedstawionymi w pytaniu i wybraną odpowiedzią) powinno być jakośgetMimeType(reviseUrl(url))
.źródło