ฉันจะรับไฟล์ประเภท mime ที่มี Uri ได้อย่างไร


86

ฉันมีรายชื่อ Uris ที่ได้รับจากคลังภาพและกล้องถ่ายรูป content://media/external/images/media/94ยูริเหล่านี้เป็นเช่นนี้ ฉันจะรับประเภทละครใบ้ได้อย่างไร

คำตอบ:


181

คุณสามารถลอง

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

แก้ไข:

mime.getExtensionFromMimeType(cR.getType(uri)) 

ผลตอบแทน -> "jpeg"

cR.getType(uri);

ส่งคืน "image / jpeg" ซึ่งเป็นค่าที่คาดหวัง


15
mime.getExtensionFromMimeType(cR.getType(uri))ส่งคืนฉัน"jpeg"แต่cR.getType(uri)กลับ"image/jpeg"เป็นมูลค่าที่คาดหวัง
Brais Gabin

สิ่งนี้ใช้ไม่ได้กับอุปกรณ์บางอย่าง .. มีทางเลือกอื่นไหม?
ปริก

2
@AditiParikh คำตอบนี้ ใช้ได้กับฉัน ...
Curiousity

1
@BraisGabin ฉันกำลังพยายามอ่านในไฟล์. csv ด้วยเหตุผลบางอย่างฉันได้รับ "text / csv" cR.getType(uri)แต่สำหรับime.getExtensionFromMimeType(cR.getType(uri));ฉันได้ค่าว่าง .csv ไม่รองรับหรืออะไร?
Justin Liu

ไม่ไม่รองรับ คุณสามารถดูรายการส่วนขยายที่สนับสนุนในปัจจุบันได้ในซอร์สโค้ดนี้
Brais Gabin

34

วิธีนี้จะคืนค่านามสกุลของไฟล์ (jpg, png, pdf, epub และอื่น ๆ .. )

 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
มันใช้งานได้สำหรับฉัน .. ฉันติดตามdeveloper.android.com/training/sharing/receive.html
amitabha2715

@Aaron ขอบคุณ ทำงานได้อย่างสมบูรณ์แบบสำหรับชื่อไฟล์ที่ไม่ใช่ภาษาอังกฤษ
Ghasem Sadeghi

12

สำหรับContent Uri.

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

สำหรับFile Uri.

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

สำหรับทั้งสองใช้งานได้Contentเช่นเดียวกับ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 () ดูเหมือนว่าจะไม่สามารถจัดการกับชื่อไฟล์ทั้งหมดได้ ตัวอย่างเช่นในโปรแกรมจำลองของฉันรูปภาพที่ถ่ายด้วยกล้องจะมีเครื่องหมายจุลภาคและช่องว่างในชื่อไฟล์ซึ่งทำให้เมธอดนี้คืนค่าสตริงว่าง ฉันขอแนะนำให้กลับไปใช้การแยกวิเคราะห์ด้วยตนเองหากการเรียกเมธอดล้มเหลว (รับดัชนีของ '.' สุดท้ายและใช้เพื่อรับสตริงย่อย)
lbenedetto

8

แทนสิ่งนี้:

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

ทำเช่นนี้:

String type = cR.getType(uri);

และคุณจะได้รับสิ่งนี้: image/jpeg.


14
ใช้ได้กับ uris เนื้อหาเท่านั้น (เนื้อหา: //) ไม่ทำงานกับไฟล์ uris (ไฟล์: //)
zyamys

จริงๆแล้วเส้นทางไม่สำคัญสำหรับ getType เป็นเพียงกรณีที่จุดสิ้นสุดอีกด้านหนึ่งของการแสดงเจตนาจำเป็นต้องกำหนดประเภทของเจตนาไว้อย่างชัดเจน บ่อยครั้งที่สิ่งนี้ไม่เกิดขึ้นสำหรับเส้นทาง
Tatarize
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.