Uri'sine sahip bir dosyanın mime türünü nasıl elde edebilirim?


86

Galeri ve Kamera ile elde edilen bir Uris Listesi var. Bunlar Uris böyledir: content://media/external/images/media/94. Mime türünü nasıl alabilirim?

Yanıtlar:


181

Deneyebilirsin

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

Düzenle :

mime.getExtensionFromMimeType(cR.getType(uri)) 

döner -> "jpeg"

cR.getType(uri);

beklenen değer olan "image / jpeg" değerini döndürür.


15
mime.getExtensionFromMimeType(cR.getType(uri))beni döndürür , "jpeg"ancak beklenen değeri cR.getType(uri)döndürür "image/jpeg".
Brais Gabin

Bu bazı cihazlar için çalışmıyor .. Başka bir alternatif var mı?
Aditi Parikh

2
@AditiParikh Bu cevap benim için çalışıyor ...
Curiousity

1
@BraisGabin Bir .csv dosyası içinde okumaya çalışıyorum. Bazı nedenlerden dolayı "text / csv" alıyorum cR.getType(uri)ama ime.getExtensionFromMimeType(cR.getType(uri));boş alıyorum. .Csv desteklenmiyor mu?
Justin Liu

Hayır, desteklenmiyor. Bu kaynak kodda şu anda desteklenen uzantıların bir listesini görebilirsiniz .
Brais Gabin

34

Bu yöntem dosyanın uzantısını (jpg, png, pdf, epub vb ..) döndürür.

 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 Teşekkürler. İngilizce olmayan dosya adları için mükemmel çalışır.
Ghasem Sadeghi

12

için Content Uri.

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

için File Uri.

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

Hem için, için çalışır Contenthem de 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;
}

MimeTypeMap.getFileExtensionFromUrl () konusunda dikkatli olun, tüm dosya adlarını işleyemiyor gibi görünüyor. Örneğin, öykünücümde, kamerayla çekilen fotoğraflar, dosya adında virgül ve boşluklar içeriyor ve bu da bu yöntemin boş bir Dize döndürmesine neden oluyor. Yöntem çağrısı başarısız olursa (son '.'
Dizinini

8

Bunun yerine:

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

Bunu yap:

String type = cR.getType(uri);

Ve bu alacak: image/jpeg.


13
Yalnızca içerik uris'leri için çalışır (içerik: //). Dosya
uris'leri

Aslında yol getType için önemli değil. Basitçe, amacın diğer ucunun, niyetin türünü açıkça belirlemiş olması gerekir. Çoğu zaman bu yollar için olmaz.
Tatarize
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.