Angenommen, ich habe einen vollständigen Dateipfad wie: (/ sdcard / tlogo.png). Ich möchte seinen Pantomimentyp kennen.
Ich habe eine Funktion dafür erstellt
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;
}
aber wenn ich es nenne, gibt es null zurück.
File file = new File(filePath);
String fileType=CommonFunctions.getMimeType(file, context);
android
filesystems
mime-types
Sushant Bhatnagar
quelle
quelle
ID3
in die Datei geschrieben hat Anfang seines Textes, um sich noch mehr mit dir anzulegen.*/*
?Ermitteln Sie den MIME-Typ einer beliebigen Datei
quelle
toLowerCase()
hat den Trick gemacht.apostrophe
! Z.B. Dateiname =Don't go baby.mp3
. DasPatternMatcher
InnereMimeTypeMap.getFileExtensionFromUrl()
kann den Dateinamen nicht verarbeiten und gibt einen leeren String zurück. null ist der Mimetyp String!I. Shvedenenko
Worked für die Probleme, auf die ich oben hingewiesen habe. Aber diese Antwort war ein Hinweis in die richtige Richtung.file://
oder beginnencontent://
.Die oben genannte MimeTypeMap-Lösung hat in meiner Verwendung null zurückgegeben. Das funktioniert und ist einfacher:
quelle
Optimierte Version von Jens ' Antwort mit Null-Sicherheit und Fallback-Typ.
Update (19.03.2018)
Bonus: Über Methoden als weniger ausführliche Kotlin-Erweiterungsfunktion :
quelle
toLoverCase
Teil.quelle
Achten Sie ganz nah Aufmerksamkeit auf umerk44 ‚s Lösung oben.
getMimeTypeFromExtension
ruft aufguessMimeTypeTypeFromExtension
und ist CASE SENSITIVE. Ich habe einen Nachmittag damit verbracht und mich dann genauer umgesehen -getMimeTypeFromExtension
wird zurückkehren,NULL
wenn Sie "JPG" übergeben, während "image / jpeg" zurückgegeben wird, wenn Sie "jpg" übergeben.quelle
Hier ist die Lösung, die ich in meiner Android-App verwendet habe:
quelle
Manchmal funktionieren die Antworten von Jeb und Jens nicht und geben null zurück. In diesem Fall verwende ich die Follow-Lösung. Der Dateikopf enthält normalerweise eine Typensignatur. Ich lese es und vergleiche es mit bekannten Unterschriften .
signatureId
ist ein Signaturindex in einem Array von Signaturen. Beispielsweise,Jetzt habe ich Dateityp, auch wenn URI der Datei nicht. Als nächstes bekomme ich MIME-Typ für Dateityp. Wenn Sie nicht wissen, welchen MIME-Typ Sie erhalten sollen, finden Sie ihn in dieser Tabelle .
Es funktioniert für viele Dateitypen. Aber für Videos funktioniert es nicht, da Sie einen bekannten Video-Codec benötigen, um einen MIME-Typ zu erhalten. Um den MIME- Typ des Videos zu erhalten, verwende ich MediaMetadataRetriever .
quelle
Ich habe versucht, Standardmethoden zu verwenden, um den MIME-Typ zu bestimmen, aber ich kann die Dateierweiterung nicht mit beibehalten
MimeTypeMap.getFileExtensionFromUrl(uri.getPath())
. Diese Methode gab mir eine leere Zeichenfolge zurück. Also habe ich eine nicht triviale Lösung gefunden, um die Dateierweiterung beizubehalten.Hier ist die Methode, die die Dateierweiterung zurückgibt:
Und nachdem die Dateierweiterung beibehalten wurde, ist es möglich, den MIME-Typ wie folgt abzurufen:
quelle
MimeTypeMap.getFileExtensionFromUrl
leere Zeichenfolge für die Dateinamen zurückgegeben, die ungültige Zeichen gemäß der internen Implementierung von a habenPatternMatcher
. Das hat bei mir komplett geklappt! Liebte es, bisher keine Probleme!String extension = file.getName().split("\\.")[1]
hätte auch funktioniert und damit die Methode getExtension () eliminiert.MimeTypeMap
Einige Dateierweiterungen wie flv, mpeg, 3gpp, cpp werden möglicherweise nicht erkannt. Sie müssen sich also überlegen, wie Sie die MimeTypeMap erweitern können, um Ihren Code zu verwalten. Hier ist ein solches Beispiel.http://grepcode.com/file/repo1.maven.org/maven2/com.google.okhttp/okhttp/20120626/libcore/net/MimeUtils.java#MimeUtils
Außerdem finden Sie hier eine vollständige Liste der MIME-Typen
http: //www.sitepoint.com/web-foundations/mime-types-complete-list/
quelle
Für Xamarin Android (Aus der Antwort von @ HoaLe oben)
quelle
quelle
quelle
quelle
Ich hatte ein ähnliches Problem. Bisher weiß ich, dass das Ergebnis für verschiedene Namen unterschiedlich sein kann, also kam ich schließlich zu dieser Lösung.
quelle
Die obige Lösung hat im Fall einer .rar-Datei null zurückgegeben, wobei URLConnection.guessContentTypeFromName (url) in diesem Fall funktioniert hat.
quelle
MIME aus lokaler Datei:
quelle
Sie haben mehrere Möglichkeiten, um eine Dateierweiterung zu erhalten: wie: 1-
String filename = uri.getLastPathSegment();
siehe diesen Link2-Sie können diesen Code auch verwenden
aber das ist nicht gut aproch. 3-Wenn Sie einen URI der Datei haben, verwenden Sie diesen Code
4-Wenn Sie eine URL haben, verwenden Sie diesen Code:
Viel Spaß mit deinem Code :)
quelle
quelle
quelle
Hat auch in meinem Fallpfad null Wert zurückgegeben
als Workaround verwenden
So sieht die Methode aus
als Ergebnis gibt es Erfolgsergebnis zurück:
Hoffe es hilft jedem
quelle
Keine der Antworten hier ist perfekt. Hier ist eine Antwort, die die besten Elemente aller Top-Antworten kombiniert:
quelle
quelle
Ich denke, der einfachste Weg ist, auf diese Ressourcendatei zu verweisen: https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/net/android.mime.types
quelle
Ich weiß nicht, warum
MimeTypeMap.getFileExtensionFromUrl()
es Probleme mitspace
s und einigen anderen Zeichen gibt, die zurückkehren""
, aber ich habe gerade diese Methode geschrieben, um den Dateinamen in einen zulässigen zu ändern. Es spielt nur mitString
s. Es funktioniert jedoch irgendwie. Durch das Verfahren wird dasspace
im Dateinamen vorhandene s in ein wünschenswertes Zeichen (das hier "x" ist) überreplaceAll(" ", "x")
und andere ungeeignete Zeichen in ein geeignetes über umgewandeltURLEncoder
. Daher sollte die Verwendung (gemäß den in der Frage angegebenen Codes und der ausgewählten Antwort) ungefähr so seingetMimeType(reviseUrl(url))
.quelle