Làm cách nào tôi có thể lấy loại kịch câm của tệp có Uri của nó?


85

Tôi có một Danh sách các Uris thu được bằng Thư viện và Máy ảnh. Những URI được như thế này: content://media/external/images/media/94. Làm thế nào tôi có thể nhận được loại kịch câm của nó?

Câu trả lời:


175

Bạn co thể thử

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

Biên tập :

mime.getExtensionFromMimeType(cR.getType(uri)) 

trả về -> "jpeg"

cR.getType(uri);

trả về "image / jpeg" là giá trị mong đợi.


15
mime.getExtensionFromMimeType(cR.getType(uri))trả lại cho tôi "jpeg"nhưng cR.getType(uri)trả về "image/jpeg"đó là giá trị mong đợi.
Brais Gabin

Điều này không hoạt động đối với một số thiết bị..Có cách nào thay thế không?
Aditi Parikh

2
@AditiParikh Câu trả lời này phù hợp với tôi ...
Curiousity

1
@BraisGabin Tôi đang cố đọc trong tệp .csv. Vì một số lý do, tôi nhận được "text / csv" cho cR.getType(uri)nhưng ime.getExtensionFromMimeType(cR.getType(uri));tôi nhận được null. .Csv không được hỗ trợ hay sao?
Justin Liu

Không, nó không được hỗ trợ. Bạn có thể xem danh sách các tiện ích mở rộng hiện được hỗ trợ trong mã nguồn này .
Brais Gabin

34

Phương thức này trả về phần mở rộng của tệp (jpg, png, pdf, epub, v.v.).

 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
Nó làm việc cho tôi .. Tôi đã theo dõi developer.android.com/training/sharing/receive.html
amitabha2715

@Aaron Cảm ơn. Nó hoạt động hoàn hảo cho các tên tệp không phải tiếng Anh.
Ghasem Sadeghi

12

cho Content Uri.

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

cho File Uri.

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

cho cả hai, hoạt động Contenttốt cho 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;
}

Hãy cẩn thận với MimeTypeMap.getFileExtensionFromUrl (), nó có vẻ như không thể xử lý tất cả các tên tệp. Ví dụ: trên trình giả lập của tôi, ảnh được chụp bằng máy ảnh chứa dấu phẩy và dấu cách trong tên tệp, điều này khiến phương thức này trả về một Chuỗi trống. Tôi khuyên bạn nên té ngửa ra phân tích cú pháp thủ công nếu lời gọi phương thức thất bại (có được chỉ số của người cuối cùng và sử dụng nó để lấy chuỗi con '')
lbenedetto

8

Thay vì điều này:

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

Làm cái này:

String type = cR.getType(uri);

Và bạn sẽ có được điều này: image/jpeg.


13
Chỉ hoạt động với uris nội dung (content: //). Không hoạt động với tệp uris (tệp: //)
zyamys

Trên thực tế, đường dẫn không quan trọng đối với getType. Nó chỉ đơn giản là trường hợp đầu bên kia của ý định cần phải đặt rõ ràng loại cho ý định. Thường thì điều này không xảy ra đối với các đường dẫn.
Tatarize
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.