¿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?

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.


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.