2013-01-14 8 views
7

Zum Beispiel wollte ich die Dateierweiterung aus der Datei-URL erhalten, die Funktion unter Verwendung von:Android: sollte ich MimeTypeMap.getFileExtensionFromUrl() verwenden? [Fehler]

Dateiname:

Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg 

URL der Datei:

String url = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg"; 

Funktionsaufruf:

String extension = MimeTypeMap.getFileExtensionFromUrl(url); 

Aber ich bekomme eine Ausnahme auf der Funktion n Anruf. Ist das ein Fehler oder eine Funktion?

Es funktioniert gut für Dateinamen, die nicht so viele fremde Zeichen (wie Paranthesis) enthalten.

Ist die Funktion fehlerhaft? Fehle ich etwas? Wie soll ich einen Fehler von einem Feature unterscheiden? Ich habe die Funktionsbeschreibung gelesen und es sollte richtig funktionieren.

Verwenden Sie es persönlich in Ihren Projekten? Es scheint nicht reliable.

Antwort

18

Wenn ich Ihren Code testen, wird keine Ausnahme für mich geworfen. Obwohl die richtige Dateierweiterung "jpg" nicht zurückgegeben wird. Ich würde nicht empfehlen, MimeTypeMap zu verwenden. Eine einfache Möglichkeit, die Dateierweiterung statt zu erhalten, ist wie folgt:

String file = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg"; 
String exten = ""; 

int i = file.lastIndexOf('.'); 
if (i > 0) { 
    exten = file.substring(i+1); 
} 

Wie, warum MimeTypeMap.getFileExtensionFromUrl(url) ausfällt? Es erwartet eine korrekt formatierte URL-Zeichenfolge, die Ihre nicht ist. Sie sollten es zuerst mit URLEncoder codieren. Zum Beispiel:

String url = "/mnt/sdcard/mydev/Greatest Hits - Lenny Kravitz (Booklet 01) [2000].jpg"; 
url = URLEncoder.encode(url, "UTF-8"); 

Diese soll erlauben MimeTypeMap.getFileExtensionFromUrl(url) richtig funktionieren, aber leider immer noch nicht wahr. Warum? URLEncoder wird alle Leerzeichen in ein "+" Zeichen ändern und getFileExtensionFromUrl berücksichtigt, dass ein ungültiges Zeichen. Dieser Teil, IMHO, ist ein Fehler.

Aus meiner Erfahrung verwenden die meisten Leute diese Methode nicht. In der Tat habe ich noch nie davon gehört, bis du diese Frage gestellt hast. Wahrscheinlich, weil das Finden einer Dateierweiterung ziemlich trivial ist und die meisten Leute Code schreiben, der dem ähnlich ist, was ich oben gepostet habe.

0

ich dies in meinem Projekt und es funktioniert, es sei denn, bestimmte Zeichen im Dateinamen,

entschied ich mich nicht um die Strecke zu gehen von den String selbst spalten.

machte ich eine Arbeit für die Frage um:

String ext = MimeTypeMap.getFileExtensionFromUrl(sanitizeFileName(Uri.encode(name))); 

Und ich habe diese Methode Dateinamen zu sanieren:

public static String sanitizeFileName(String name) 
{ 
    byte[] invalidChars = new byte[]{34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47}; 
    for(byte i : invalidChars) 
    { 
     name = name.replace((char)i,'_'); 
    } 
    return name; 
} 

Die sanitize Methode auch für andere Dinge nützlich ist.

2
private String getMimeTypeFromPath(String path) { 
    String extension = path; 
    int lastDot = extension.lastIndexOf('.'); 
    if (lastDot != -1) { 
     extension = extension.substring(lastDot + 1); 
    } 
    // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). 
    extension = extension.toLowerCase(Locale.getDefault()); 
    if (extension.equals("3ga")) { 
     return "audio/3gpp"; 
    } else if (extension.equals("js")) { 
     // Missing from the map :(. 
     return "text/javascript"; 
    } 
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
} 
Verwandte Themen