Come posso ottenere il tipo MIME di un file con il suo Uri?


86

Ho una lista di Uris ottenuta con la Galleria e la Fotocamera. Questi Uris sono come questo: content://media/external/images/media/94. Come posso ottenere il suo tipo mimo?

Risposte:


181

Puoi provare

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

Modificare :

mime.getExtensionFromMimeType(cR.getType(uri)) 

restituisce -> "jpeg"

cR.getType(uri);

restituisce "image / jpeg" che è il valore atteso.


15
mime.getExtensionFromMimeType(cR.getType(uri))mi restituisce "jpeg"ma cR.getType(uri)restituisce "image/jpeg"che è il valore atteso.
Brais Gabin

Questo non funziona per alcuni dispositivi .. C'è qualche alternativa?
Aditi Parikh

2
@AditiParikh Questa risposta funziona per me ...
Curiosità

1
@ BraisGabin Sto cercando di leggere un file .csv. Per qualche motivo ottengo "text / csv" per cR.getType(uri)ma per ime.getExtensionFromMimeType(cR.getType(uri));ottengo null. .Csv non è supportato o qualcosa del genere?
Justin Liu,

No, non è supportato. Puoi vedere un elenco delle estensioni attualmente supportate in questo codice sorgente .
Brais Gabin

34

Questo metodo restituisce l'estensione del file (jpg, png, pdf, epub ecc ..).

 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
Sta

@Aaron Thanks. Funziona perfettamente per nomi di file non inglesi.
Ghasem Sadeghi

12

per Content Uri .

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

per File Uri .

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

per entrambi, funziona per Contentoltre 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;
}

Fai attenzione con MimeTypeMap.getFileExtensionFromUrl (), sembra non essere in grado di gestire tutti i nomi di file. Ad esempio, sul mio emulatore, le foto scattate con la fotocamera contengono virgole e spazi nel nome del file, il che fa sì che questo metodo restituisca una stringa vuota. Consiglio di tornare all'analisi manuale se la chiamata al metodo non è riuscita (ottieni l'indice dell'ultimo "." E
usalo

8

Invece di questo:

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

Fai questo:

String type = cR.getType(uri);

Ed otterrete questo: image/jpeg.


14
Funziona solo per i contenuti uris (content: //). Non funziona per il file uris (file: //)
zyamys

In realtà il percorso non ha importanza per getType. È semplicemente il caso che l'altra estremità dell'intento debba aver impostato esplicitamente il tipo per l'intento. Spesso questo non accade per i percorsi.
Tatarize il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.