วิธีการระบุประเภทไฟล์ MIME ใน Android?


176

สมมติว่าฉันมีเส้นทางแบบเต็มเช่น: (/ sdcard / tlogo.png) ฉันต้องการทราบประเภท mime ของมัน

ฉันสร้างฟังก์ชั่นสำหรับมัน

public static String getMimeType(File file, Context context)    
{
    Uri uri = Uri.fromFile(file);
    ContentResolver cR = context.getContentResolver();
    MimeTypeMap mime = MimeTypeMap.getSingleton();
    String type = mime.getExtensionFromMimeType(cR.getType(uri));
    return type;
}

แต่เมื่อฉันเรียกมันจะคืนค่าเป็นศูนย์

File file = new File(filePath);
String fileType=CommonFunctions.getMimeType(file, context);

คำตอบ:


323

ก่อนอื่นคุณควรพิจารณาการโทรMimeTypeMap#getMimeTypeFromExtension()แบบนี้

// url = file path or whatever suitable URL you want.
public static String getMimeType(String url) {
    String type = null;
    String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    }
    return type;
}

4
ขอบคุณงานสำหรับฉันและวิธีแก้ไขปัญหาของฉันคือ: สาธารณะคงที่ String getMimeType (เส้นทางสตริงบริบทบริบท) {Extention String = path.substring (path.lastIndexOf (".")); String mimeTypeMap = MimeTypeMap.getFileExtensionFromUrl (ส่วนขยาย); String mimeType = MimeTypeMap.getSingleton () .getMimeTypeFromExtension (mimeTypeMap); return mimeType;}
Sushant Bhatnagar

13
และถ้าไฟล์มีนามสกุลไม่ดี? บุคคลสามารถสร้าง. mp3 และประกอบด้วยข้อความ
throrin19

2
จากนั้นคุณจะต้องเปิดไฟล์และตรวจสอบหมายเลขเวทย์มนตร์ (ขึ้นอยู่กับรูปแบบของ c) ใน lead-in - อย่างไรก็ตามสิ่งนี้ยังถือว่าผู้เปลี่ยนชื่อไฟล์ txt เป็น mp3 ไม่เพียงแค่เขียนID3ใน จุดเริ่มต้นของข้อความของเขาที่จะยุ่งกับคุณมากยิ่งขึ้น
Jens

1
หากไฟล์มีนามสกุลที่ไม่รู้จัก วิธีการคืนสินค้า*/*ไหม?

3
หากคุณมีเส้นทางไฟล์เป็น / storage / emulated / 0 / Download / images (4) .jpg และคุณขอ mimetype ก็จะส่งคืน null
Kalaiselvan

165

ตรวจจับชนิด mime ของไฟล์ใด ๆ

public String getMimeType(Uri uri) {           
    String mimeType = null;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = getAppContext().getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

5
นี่ควรเป็นคำตอบที่ถูกต้อง toLowerCase()ทำเคล็ดลับ
Rajat Saxena

1
นี่เป็นคำตอบที่ดีที่สุด แต่ก็ล้มเหลวอย่างน่าสมเพชถ้าชื่อไฟล์มีอักขระพิเศษในกรณีของฉันapostrophe! เช่น. ชื่อไฟล์ Don't go baby.mp3= PatternMatcherภายในMimeTypeMap.getFileExtensionFromUrl()ไม่สามารถจัดการกับชื่อไฟล์และส่งกลับสตริงว่าง; null ออกมาเป็นสตริง mimetype!
sud007

มีวิธีแก้ปัญหาที่คล้ายกัน แต่ไม่มีข้อผิดพลาดด้านล่างโดยI. Shvedenenkoทำงานสำหรับปัญหาที่ฉันได้กล่าวไว้ข้างต้น แต่คำตอบนี้เป็นตัวชี้ไปในทิศทางที่ถูกต้อง
sud007

รหัสนี้ส่งคืน null ด้วย String "/ storage / emulated / 0 / dcim / screenshots / screenshot_20190319-123828_ubl digital app.jpg"
อับดุล

@Abdul เป็นเพราะเส้นทางนั้นไม่มีรูปแบบ Uri มันก็ควรจะเริ่มต้นด้วยหรือfile:// content://
HB

33

วิธีการแก้ปัญหา MimeTypeMap ข้างต้นกลับเป็นโมฆะในการใช้งานของฉัน ใช้งานได้และง่ายกว่า:

Uri uri = Uri.fromFile(file);
ContentResolver cR = context.getContentResolver();
String mime = cR.getType(uri);

19
วิธีนี้ยังสามารถส่งคืน null
มิสเตอร์สมิ ธ

ดูเหมือนว่าจะสามารถคืนค่า Null หรือไม่ก็ตามตาม URI ดูเหมือนไม่มีใครรู้ว่าทำไม ;-(
Thomas Decaux

10
หากสื่อถูกเลือกจากแกลเลอรี่ Android แล้ว TYPE จะถูกส่งกลับ หากเลือกจากตัวจัดการไฟล์จะมีการส่งคืนค่า null
ราหุล Rastogi

ฉันสามารถยืนยันสิ่งที่ราหุลกล่าวในเชิงบวกได้เพียงทดสอบและเขาพูดถูก
Chris

ในอุปกรณ์บางอย่างถ้าฉันเลือกภาพจากแกลเลอรี่มันก็จะกลับมาเป็นโมฆะ
Ghanshyam Nayma

21

รุ่นที่ปรับปรุงประสิทธิภาพของJere ' answerere ด้วย null-safety และ fallback-type

@NonNull
static String getMimeType(@NonNull File file) {
    String type = null;
    final String url = file.toString();
    final String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
    }
    if (type == null) {
        type = "image/*"; // fallback type. You might set it to */*
    }
    return type;
}

สำคัญ : getFileExtensionFromUrl () ใช้ได้กับตัวพิมพ์เล็กเท่านั้น!


อัปเดต (19.03.2018)

โบนัส: วิธีการข้างต้นเป็นฟังก์ชั่นการขยาย Kotlin ที่ละเอียดน้อยกว่า:

fun File.getMimeType(fallback: String = "image/*"): String {
    return MimeTypeMap.getFileExtensionFromUrl(toString())
            ?.run { MimeTypeMap.getSingleton().getMimeTypeFromExtension(toLowerCase()) }
            ?: fallback // You might set it to */*
}

สิ่งนี้ใช้ได้ผล verbose บิตมากเกินไปสำหรับความชอบของฉันแม้ว่า
filthy_wizard

แน่นอนว่าสิ่งนี้สามารถเขียนได้ในลักษณะที่สั้นกว่า ด้วย Kotlin อาจมีเพียงสองหรือสามบรรทัดอย่างไรก็ตามสุนัขจิ้งจอกอยู่ในความปลอดภัยและtoLoverCaseเป็นส่วนหนึ่ง
โทเบียส

@filthy_wizard เพิ่มรุ่นที่เหมาะสำหรับคุณ ;-)
Tobias

สำหรับฉันที่ใช้ getPath () วิธีแทน toString () มีความชัดเจนมากขึ้นและเพียงแค่เส้นทางโดยใช้ไวยากรณ์การเข้าถึงคุณสมบัติ kotlin
Leonid

15
File file = new File(path, name);

    MimeTypeMap mime = MimeTypeMap.getSingleton();
    int index = file.getName().lastIndexOf('.')+1;
    String ext = file.getName().substring(index).toLowerCase();
    String type = mime.getMimeTypeFromExtension(ext);

    intent.setDataAndType(Uri.fromFile(file), type);
    try
    {
      context.startActivity(intent);
    }
    catch(ActivityNotFoundException ex)
    {
        ex.printStackTrace();

    }

1
ทำงานได้สมบูรณ์แบบสำหรับฉัน! แต่วิธีการเกี่ยวกับการใช้ FilenameUtils.getExetension (เส้นทาง) เพื่อรับไฟล์นามสกุล?
peterb

7

ให้ความสนใจซุปเปอร์ใกล้กับumerk44 's วิธีการแก้ปัญหาดังกล่าวข้างต้น getMimeTypeFromExtensionร้องขอguessMimeTypeTypeFromExtensionและเป็นกรณีที่มีความสำคัญ ฉันใช้เวลาในบ่ายวันนี้แล้วลองมองดู - getMimeTypeFromExtensionจะกลับมาNULLถ้าคุณผ่าน "JPG" ในขณะที่มันจะส่งคืน "image / jpeg" ถ้าคุณผ่าน "jpg"


5

นี่คือทางออกที่ฉันใช้ในแอพ Android ของฉัน:

public static String getMimeType(String url)
    {
        String extension = url.substring(url.lastIndexOf("."));
        String mimeTypeMap = MimeTypeMap.getFileExtensionFromUrl(extension);
        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(mimeTypeMap);
        return mimeType;
    }

1
URL? URL จำนวนมากไม่มีส่วนขยาย ตัวอย่างเช่นหน้านี้ไม่มีส่วนขยาย สำหรับ url คุณควรใช้ URL ใหม่ (url) .openConnection (). getRequestProperty ("Content-type");
barwnikk

5

บางครั้งคำตอบของ Jeb และ Jens ไม่ทำงานและคืนค่าว่าง ในกรณีนี้ฉันใช้โซลูชันติดตาม ส่วนหัวของไฟล์มักจะมีลายเซ็นประเภท ฉันอ่านมันและเปรียบเทียบกับที่รู้จักกันในรายชื่อของลายเซ็น

/**
 *
 * @param is InputStream on start of file. Otherwise signature can not be defined.
 * @return int id of signature or -1, if unknown signature was found. See SIGNATURE_ID_(type) constants to
 *      identify signature by its id.
 * @throws IOException in cases of read errors.
 */
public static int getSignatureIdFromHeader(InputStream is) throws IOException {
    // read signature from head of source and compare with known signatures
    int signatureId = -1;
    int sigCount = SIGNATURES.length;
    int[] byteArray = new int[MAX_SIGNATURE_LENGTH];
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {
        byteArray[i] = is.read();
        builder.append(Integer.toHexString(byteArray[i]));
    }
    if (DEBUG) {
        Log.d(TAG, "head bytes=" + builder.toString());
    }
    for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {

        // check each bytes with known signatures
        int bytes = byteArray[i];
        int lastSigId = -1;
        int coincidences = 0;

        for (int j = 0; j < sigCount; j++) {
            int[] sig = SIGNATURES[j];

            if (DEBUG) {
                Log.d(TAG, "compare" + i + ": " + Integer.toHexString(bytes) + " with " + sig[i]);
            }
            if (bytes == sig[i]) {
                lastSigId = j;
                coincidences++;
            }
        }

        // signature is unknown
        if (coincidences == 0) {
            break;
        }
        // if first bytes of signature is known we check signature for full coincidence
        if (coincidences == 1) {
            int[] sig = SIGNATURES[lastSigId];
            int sigLength = sig.length;
            boolean isSigKnown = true;
            for (; i < MAX_SIGNATURE_LENGTH && i < sigLength; i++) {
                bytes = byteArray[i];
                if (bytes != sig[i]) {
                    isSigKnown = false;
                    break;
                }
            }
            if (isSigKnown) {
                signatureId = lastSigId;
            }
            break;
        }
    }
    return signatureId;
}

signatureIdเป็นดัชนีของลายเซ็นในอาร์เรย์ของลายเซ็น ตัวอย่างเช่น,

private static final int[] SIGNATURE_PNG = hexStringToIntArray("89504E470D0A1A0A");
private static final int[] SIGNATURE_JPEG = hexStringToIntArray("FFD8FF");
private static final int[] SIGNATURE_GIF = hexStringToIntArray("474946");

public static final int SIGNATURE_ID_JPEG = 0;
public static final int SIGNATURE_ID_PNG = 1;
public static final int SIGNATURE_ID_GIF = 2;
private static final int[][] SIGNATURES = new int[3][];

static {
    SIGNATURES[SIGNATURE_ID_JPEG] = SIGNATURE_JPEG;
    SIGNATURES[SIGNATURE_ID_PNG] = SIGNATURE_PNG;
    SIGNATURES[SIGNATURE_ID_GIF] = SIGNATURE_GIF;
}

ตอนนี้ฉันมีประเภทไฟล์แม้ว่า URI ของไฟล์จะไม่ ต่อไปฉันจะได้รับ mime type ตามประเภทไฟล์ หากคุณไม่ทราบว่าจะรับ mime ประเภทใดคุณสามารถดูได้ในตารางนี้นี้

มันทำงานได้กับไฟล์หลายประเภท แต่สำหรับวิดีโอมันใช้งานไม่ได้เพราะคุณจำเป็นต้องรู้จักตัวแปลงสัญญาณวิดีโอเพื่อรับชนิด mime ที่จะได้รับชนิดไมม์วิดีโอของฉันใช้MediaMetadataRetriever


4

ฉันพยายามใช้วิธีมาตรฐานเพื่อกำหนดประเภท mime แต่ฉันไม่สามารถใช้นามสกุลไฟล์ได้ MimeTypeMap.getFileExtensionFromUrl(uri.getPath())ไปได้ วิธีนี้คืนสตริงว่างให้ฉัน ดังนั้นฉันจึงไม่แก้ปัญหาเรื่องเล็กน้อยเพื่อรักษานามสกุลไฟล์

นี่คือวิธีการคืนนามสกุลไฟล์:

private String getExtension(String fileName){
    char[] arrayOfFilename = fileName.toCharArray();
    for(int i = arrayOfFilename.length-1; i > 0; i--){
        if(arrayOfFilename[i] == '.'){
            return fileName.substring(i+1, fileName.length());
        }
    }
    return "";
}

และหากยังคงนามสกุลไฟล์อยู่จึงเป็นไปได้ที่จะรับชนิด mime ดังต่อไปนี้:

public String getMimeType(File file) {
    String mimeType = "";
    String extension = getExtension(file.getName());
    if (MimeTypeMap.getSingleton().hasExtension(extension)) {
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    }
    return mimeType;
}

ผู้ชายนี่ตอกย้ำคำตอบทั้งหมดที่โพสต์ไว้ที่นี่ในปัญหานี้! ฉันมีปัญหาเดียวกันกับคลาสของ Legacy ทั้งหมด ปัญหาเป็นเช่นเดียวกับที่คุณได้กล่าวถึงกลับสตริงที่ว่างเปล่าสำหรับชื่อไฟล์ที่มีตัวอักษรที่ไม่ถูกต้องตามการดำเนินการภายในของMimeTypeMap.getFileExtensionFromUrl PatternMatcherสิ่งนี้ใช้ได้สำหรับฉันอย่างสมบูรณ์! ชอบมันมากไม่มีปัญหา!
sud007

@ผม. Shvedenenko String extension = file.getName().split("\\.")[1]ก็จะทำงานได้เช่นกันดังนั้นกำจัดเมธอด getExtension ()
Shahood ul Hassan

แต่สิ่งที่เกิดขึ้นคือถ้าใช้นามสกุลที่ไม่ถูกต้องขณะสร้างไฟล์ ควรเป็นผู้ตัดสินประเภท mime แต่เพียงผู้เดียวหรือไม่
Shahood ul Hassan

2

MimeTypeMapอาจไม่รู้จักนามสกุลไฟล์บางไฟล์เช่น flv, mpeg, 3gpp, cpp ดังนั้นคุณต้องคิดวิธีการขยาย MimeTypeMap เพื่อรักษารหัสของคุณ นี่คือตัวอย่างดังกล่าว

http://grepcode.com/file/repo1.maven.org/maven2/com.google.okhttp/okhttp/20120626/libcore/net/MimeUtils.java#MimeUtils

นอกจากนี้นี่คือรายการประเภท mime ทั้งหมด

http: //www.sitepoint.com/web-foundations/mime-types-complete-list/


2

สำหรับXamarin Android (จากคำตอบของ @ HoaLe ด้านบน)

public String getMimeType(Uri uri) {
    String mimeType = null;
    if (uri.Scheme.Equals(ContentResolver.SchemeContent))
    {
        ContentResolver cr = Application.Context.ContentResolver;
        mimeType = cr.GetType(uri);
    }
    else
    {
        String fileExtension = MimeTypeMap.GetFileExtensionFromUrl(uri.ToString());
        mimeType = MimeTypeMap.Singleton.GetMimeTypeFromExtension(
        fileExtension.ToLower());
    }
    return mimeType;
}

1
get file object....
File file = new File(filePath);

then....pass as a parameter to...

getMimeType(file);

...here is 


public String getMimeType(File file) {
        String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()).toLowerCase());
        if (mimetype == null) {
            return "*/*";
        }
        return mimetype;///return the mimeType
    }

1

ในขณะที่มาจากสินทรัพย์ / ไฟล์ (โปรดทราบว่ามีบางกรณีที่หายไปจาก MimeTypeMap)

private String getMimeType(String path) {
    if (null == path) return "*/*";

    String extension = path;
    int lastDot = extension.lastIndexOf('.');
    if (lastDot != -1) {
        extension = extension.substring(lastDot + 1);
    }

    // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185).
    extension = extension.toLowerCase(Locale.getDefault());
    if (extension.equals("3ga")) {
        return "audio/3gpp";
    } else if (extension.equals("js")) {
        return "text/javascript";
    } else if (extension.equals("woff")) {
        return "application/x-font-woff";
    } else {
        // TODO
        // anyting missing from the map (http://www.sitepoint.com/web-foundations/mime-types-complete-list/)
        // reference: http://grepcode.com/file/repo1.maven.org/maven2/com.google.okhttp/okhttp/20120626/libcore/net/MimeUtils.java#MimeUtils
    }

    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

ในขณะที่ใช้ ContentResolver

contentResolver.getType(uri)

ในขณะที่คำขอ http / https

    try {
        HttpURLConnection conn = httpClient.open(new URL(uri.toString()));
        conn.setDoInput(false);
        conn.setRequestMethod("HEAD");
        return conn.getHeaderField("Content-Type");
    } catch (IOException e) {
    }

1
// This will return the mimeType. 
// for eg. xyz.png it will return image/png. 
// here uri is the file that we were picked using intent from ext/internal storage.
private String getMimeType(Uri uri) {
   // This class provides applications access to the content model.  
   ContentResolver contentResolver = getContentResolver();

   // getType(Uri url)-Return the MIME type of the given content URL. 
   return contentResolver.getType(uri);
}

โปรดให้คำอธิบายบางอย่าง มันจะช่วยให้ผู้อ่านเริ่มต้นปรับรหัสของเขา / เธอและผู้อ่านเพิ่มเติมเพื่อรับประโยชน์สูงสุดจากคำตอบของคุณ
Aurélien B

ขอบคุณสำหรับคำตอบของคุณ ฉันแก้ไขด้วยคำอธิบาย
iamdhariot

1

ฉันประสบปัญหาคล้ายกัน จนถึงตอนนี้ฉันรู้ว่าผลลัพธ์อาจแตกต่างกันสำหรับชื่อที่แตกต่างกันดังนั้นในที่สุดก็มาถึงวิธีการแก้ปัญหานี้

public String getMimeType(String filePath) {
    String type = null;
    String extension = null;
    int i = filePath.lastIndexOf('.');
    if (i > 0)
        extension = filePath.substring(i+1);
    if (extension != null)
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    return type;
}  


0

mime จากไฟล์โลคอล:

String url = file.getAbsolutePath();
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mime = fileNameMap.getContentTypeFor("file://"+url);

0

คุณมีหลายทางเลือกในการรับไฟล์นามสกุล: like: 1- String filename = uri.getLastPathSegment();ดูลิงค์นี้

2- คุณสามารถใช้รหัสนี้ได้

 filePath .substring(filePath.lastIndexOf(".")+1);

แต่มันไม่ดีเลยนะ 3- ถ้าคุณมีไฟล์ URI ให้ใช้รหัสนี้

String[] projection = { MediaStore.MediaColumns.DATA,
MediaStore.MediaColumns.MIME_TYPE };

4- ถ้าคุณมี URL แล้วใช้รหัสนี้:

 public static String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) { 


  type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    }

return type;
}

เพลิดเพลินไปกับรหัสของคุณ :)


0
// new processing the mime type out of Uri which may return null in some cases
String mimeType = getContentResolver().getType(uri);
// old processing the mime type out of path using the extension part if new way returned null
if (mimeType == null){mimeType URLConnection.guessContentTypeFromName(path);}

0
public static String getFileType(Uri file)
{
    try
    {
        if (file.getScheme().equals(ContentResolver.SCHEME_CONTENT))
            return subStringFromLastMark(SystemMaster.getContentResolver().getType(file), "/");
        else
            return MimeTypeMap.getFileExtensionFromUrl(file.toString()).toLowerCase();
    }
    catch(Exception e)
    {
        return null;
    }
}

public static String getMimeType(Uri file)
{
    try
    {
        return MimeTypeMap.getSingleton().getMimeTypeFromExtension(getFileType(file));
    }
    catch(Exception e)
    {
        return null;
    }
}

public static String subStringFromLastMark(String str,String mark)
{
    int l = str.lastIndexOf(mark);
    int end = str.length();
    if(l == -1)
        return str;

    return str.substring(l + 1, end);
}

0

ยังได้คืนค่า Null ในเส้นทางของฉันด้วย

/ storage / emulated / 0 / Music / 01 - Ghost on the Dance Floor.mp3

เป็นการหลีกเลี่ยงการใช้งาน

val url = inUrl.replace ("", "")

ดังนั้นวิธีการดูเหมือน

@JvmStatic
    fun getMimeType(inUrl: String?): String {
        if (inUrl == null) return ""

        val url = inUrl.replace(" ","")
        var type: String? = null

        val extension = MimeTypeMap.getFileExtensionFromUrl(url)
        if (extension != null) {
            type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase())
        }

        if(type ==null){
            val cR = WifiTalkie.getApplicationContext().contentResolver
            type = cR.getType(Uri.parse(url))
        }

        if (type == null) {
            type = "*/*" // fallback method_type. You might set it to */*
        }
        return type
    }

ผลลัพธ์จะส่งคืนผลลัพธ์ความสำเร็จ:

เสียง / MPEG

หวังว่ามันจะช่วยให้ทุกคน


0

ไม่มีคำตอบที่นี่สมบูรณ์แบบ นี่คือคำตอบที่รวมองค์ประกอบที่ดีที่สุดของคำตอบยอดนิยมทั้งหมด:

public final class FileUtil {

    // By default, Android doesn't provide support for JSON
    public static final String MIME_TYPE_JSON = "application/json";

    @Nullable
    public static String getMimeType(@NonNull Context context, @NonNull Uri uri) {

        String mimeType = null;
        if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            ContentResolver cr = context.getContentResolver();
            mimeType = cr.getType(uri);
        } else {
            String fileExtension = getExtension(uri.toString());

            if(fileExtension == null){
                return null;
            }

            mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                    fileExtension.toLowerCase());

            if(mimeType == null){
                // Handle the misc file extensions
                return handleMiscFileExtensions(fileExtension);
            }
        }
        return mimeType;
    }

    @Nullable
    private static String getExtension(@Nullable String fileName){

        if(fileName == null || TextUtils.isEmpty(fileName)){
            return null;
        }

        char[] arrayOfFilename = fileName.toCharArray();
        for(int i = arrayOfFilename.length-1; i > 0; i--){
            if(arrayOfFilename[i] == '.'){
                return fileName.substring(i+1, fileName.length());
            }
        }
        return null;
    }

    @Nullable
    private static String handleMiscFileExtensions(@NonNull String extension){

        if(extension.equals("json")){
            return MIME_TYPE_JSON;
        }
        else{
            return null;
        }
    }
}

0
Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
                        File file = new File(filePatch); 
                        Uri uris = Uri.fromFile(file);
                        String mimetype = null;
                        if 
(uris.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
                            ContentResolver cr = 
getApplicationContext().getContentResolver();
                            mimetype = cr.getType(uris);
                        } else {
                            String fileExtension = 
MimeTypeMap.getFileExtensionFromUrl(uris.toString());
mimetype =  MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase());
                        }


0

ฉันไม่ทราบว่าทำไมMimeTypeMap.getFileExtensionFromUrl()มีปัญหากับspaces และตัวละครอื่น ๆ ที่กลับ""มา แต่ฉันเพิ่งเขียนวิธีการนี้เพื่อเปลี่ยนชื่อไฟล์เป็นที่ยอมรับได้ มันแค่เล่นกับStringเอส อย่างไรก็ตามมันเป็นงาน โดยวิธีการspaceที่มีอยู่ในชื่อไฟล์จะกลายเป็นตัวละครที่น่าพอใจ (ซึ่งที่นี่เป็น "x") ผ่านทางreplaceAll(" ", "x")และตัวอักษรที่ไม่เหมาะสมอื่น ๆ URLEncoderจะกลายเป็นหนึ่งในที่เหมาะสมผ่านทาง เพื่อให้การใช้งาน (ตามรหัสที่นำเสนอในคำถามและคำตอบที่เลือก) getMimeType(reviseUrl(url))ควรจะเป็นสิ่งที่ชอบ

private String reviseUrl(String url) {

        String revisedUrl = "";
        int fileNameBeginning = url.lastIndexOf("/");
        int fileNameEnding = url.lastIndexOf(".");

        String cutFileNameFromUrl = url.substring(fileNameBeginning + 1, fileNameEnding).replaceAll(" ", "x");

        revisedUrl = url.
                substring(0, fileNameBeginning + 1) +
                java.net.URLEncoder.encode(cutFileNameFromUrl) +
                url.substring(fileNameEnding, url.length());

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