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?

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.


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;
}

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;
}

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.