Como posso obter o tipo MIME de um arquivo com seu Uri?

86

Tenho uma lista de Uris obtida com a Galeria e a câmera. Estes Uris são assim: content://media/external/images/media/94. Como posso obter seu tipo de mímica?

Brais Gabin
fonte

Respostas:

181

Podes tentar

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

Editar:

mime.getExtensionFromMimeType(cR.getType(uri)) 

retorna -> "jpeg"

cR.getType(uri);

retorna "image / jpeg" que é o valor esperado.

Kartik Domadiya
fonte
15
mime.getExtensionFromMimeType(cR.getType(uri))me retorna, "jpeg"mas cR.getType(uri)retorna "image/jpeg"que é o valor esperado.
Brais Gabin de
Isso não está funcionando para alguns dispositivos .. Existe alguma alternativa?
Aditi Parikh de
2
@AditiParikh Esta resposta funciona para mim ...
Curiosidade
1
@BraisGabin Estou tentando ler um arquivo .csv. Por alguma razão, recebo "text / csv" para, cR.getType(uri)mas ime.getExtensionFromMimeType(cR.getType(uri));obtenho null. .Csv simplesmente não é compatível ou algo assim?
Justin Liu
Não, não é compatível. Você pode ver uma lista das extensões atualmente suportadas neste código-fonte .
Brais Gabin
34

Este método retorna a extensão do arquivo (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
fonte
2
Está funcionando para mim .. Eu segui developer.android.com/training/sharing/receive.html
amitabha2715
@Aaron Obrigado. Funciona perfeitamente com nomes de arquivos que não sejam em 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 para Contentbem 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
fonte
Tenha cuidado com MimeTypeMap.getFileExtensionFromUrl (), parece não ser capaz de lidar com todos os nomes de arquivo. Por exemplo, no meu emulador, as fotos tiradas com a câmera contêm vírgulas e espaços no nome do arquivo, o que faz com que esse método retorne uma String vazia. Eu recomendo voltar para a análise manual se a chamada do método falhar (pegue o índice do último '.' E use-o para pegar a substring)
lbenedetto
8

Em vez disso:

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

Faça isso:

String type = cR.getType(uri);

E você vai ter este: image/jpeg.

Mohamed Ibrahim
fonte
13
Funciona apenas para conteúdo uris (conteúdo: //). Não funciona para o arquivo uris (arquivo: //)
zyamys
Na verdade, o caminho não importa para getType. É simplesmente o caso em que a outra extremidade da intent precisa ter definido explicitamente o tipo da intent. Muitas vezes isso não acontece com caminhos.
Tatarize em