Wie kann ich den MIME-Typ einer Datei mit Uri ermitteln?

85

Ich habe eine Liste von Uris mit der Galerie und der Kamera erhalten. Diese Uris sind wie folgt : content://media/external/images/media/94. Wie kann ich seinen Pantomimentyp bekommen?

Brais Gabin
quelle

Antworten:

175

Du kannst es versuchen

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

Bearbeiten:

mime.getExtensionFromMimeType(cR.getType(uri)) 

gibt zurück -> "jpeg"

cR.getType(uri);

gibt "image / jpeg" zurück, das ist der erwartete Wert.

Kartik Domadiya
quelle
15
mime.getExtensionFromMimeType(cR.getType(uri))kehrt mich "jpeg"aber cR.getType(uri)zurückkehrt , "image/jpeg"dass der erwartete Wert ist.
Brais Gabin
Dies funktioniert bei einigen Geräten nicht. Gibt es eine Alternative?
Aditi Parikh
2
@ AditiParikh Diese Antwort funktioniert für mich ...
Neugier
1
@BraisGabin Ich versuche, eine CSV-Datei einzulesen. Aus irgendeinem Grund bekomme ich "text / csv" für, cR.getType(uri)aber dafür ime.getExtensionFromMimeType(cR.getType(uri));bekomme ich null. Wird CSV einfach nicht unterstützt oder so?
Justin Liu
Nein, es wird nicht unterstützt. In diesem Quellcode sehen Sie eine Liste der derzeit unterstützten Erweiterungen .
Brais Gabin
34

Diese Methode gibt die Erweiterung der Datei zurück (jpg, png, pdf, epub usw.).

 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;
}
Aaron
quelle
2
Es funktioniert für mich. Ich folgte developer.android.com/training/sharing/receive.html
amitabha2715
@ Aaron Danke. Es funktioniert perfekt für nicht englische Dateinamen.
Ghasem Sadeghi
12

für Content Uri.

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

für File Uri.

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

für beide funktioniert sowohl für Contentals auch 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;
}
Bhavesh Rangani
quelle
Seien Sie vorsichtig mit MimeTypeMap.getFileExtensionFromUrl (), es scheint nicht in der Lage zu sein, alle Dateinamen zu verarbeiten. In meinem Emulator enthalten mit der Kamera aufgenommene Fotos beispielsweise Kommas und Leerzeichen im Dateinamen, wodurch diese Methode eine leere Zeichenfolge zurückgibt. Ich empfehle, auf manuelles Parsen zurückzugreifen, wenn der Methodenaufruf fehlgeschlagen ist (den Index des letzten '.'
Abrufen
8

An Stelle von:

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

Mach das:

String type = cR.getType(uri);

Und Sie werden dies bekommen : image/jpeg.

Mohamed Ibrahim
quelle
13
Funktioniert nur für Content Uris (Content: //). Funktioniert nicht für Datei uris (Datei: //)
Zyamys
Eigentlich spielt der Pfad für den getType keine Rolle. Es ist einfach so, dass das andere Ende der Absicht den Typ für die Absicht explizit festgelegt haben muss. Oft passiert dies nicht für Pfade.
Tatarize