¿Cómo puedo obtener el tipo mime de un archivo que tiene su Uri?

85

Tengo una Lista de Uris obtenida con la Galería y la Cámara. Estas infecciones son como esto: content://media/external/images/media/94. ¿Cómo puedo conseguir su tipo mimo?

Brais Gabin
fuente

Respuestas:

175

Puedes probar

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

Editar:

mime.getExtensionFromMimeType(cR.getType(uri)) 

devuelve -> "jpeg"

cR.getType(uri);

devuelve "image / jpeg" que es el valor esperado.

Kartik Domadiya
fuente
15
mime.getExtensionFromMimeType(cR.getType(uri))me devuelve "jpeg"pero cR.getType(uri)devuelve "image/jpeg"ese es el valor esperado.
Brais Gabin
Esto no funciona para algunos dispositivos. ¿Existe alguna alternativa?
Aditi Parikh
2
@AditiParikh Esta respuesta funciona para mí ...
Curiousity
1
@BraisGabin Estoy intentando leer en un archivo .csv. Por alguna razón, obtengo "text / csv" para cR.getType(uri)pero ime.getExtensionFromMimeType(cR.getType(uri));obtengo nulo. ¿.Csv simplemente no es compatible o algo así?
Justin Liu
No, no es compatible. Puede ver una lista de las extensiones admitidas actualmente en este código fuente .
Brais Gabin
34

Este método devuelve la extensión del archivo (jpg, png, pdf, epub, etc.).

 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
fuente
2
Funciona
@ Aaron Gracias. Funciona perfectamente para nombres de archivos que no están en inglés.
Ghasem Sadeghi
12

para Content Uri.

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

para File Uri.

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

para Ambos, funciona Contenttan bien como 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
fuente
Tenga cuidado con MimeTypeMap.getFileExtensionFromUrl (), parece que no puede manejar todos los nombres de archivo. Por ejemplo, en mi emulador, las fotos tomadas con la cámara contienen comas y espacios en el nombre del archivo, lo que hace que este método devuelva una cadena vacía. Recomiendo volver al análisis manual si la llamada al método falló (obtenga el índice del último '.' Y
úselo
8

En lugar de esto:

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

Hacer esto:

String type = cR.getType(uri);

Y obtendrá la siguiente: image/jpeg.

Mohamed Ibrahim
fuente
13
Solo funciona para contenido uris (contenido: //). No funciona para archivos uris (archivo: //)
zyamys
En realidad, la ruta no importa para getType. Es simplemente el caso de que el otro extremo de la intención debe haber establecido explícitamente el tipo de la intención. Muchas veces esto no sucede con los caminos.
Tatarizar