如何获取奇怪命名文件的MIME类型?

时间:2012-02-28 18:11:46

标签: android mime-types

我正在编写一个基本文件浏览器,根据文件的MIME类型更改用于显示文件的图标,但是我找不到某些文件的MIME类型,我不知道为什么,我用来查找MIME类型的代码是:

    private String getFileMimeType(File file)
{
    Uri fileUri = Uri.fromFile(file);
    String ext = MimeTypeMap.getFileExtensionFromUrl(fileUri.toString());
    return mtm.getMimeTypeFromExtension(ext);
}

它适用于某些文件,但不适用于其中包含更复杂字符的某些文件,我不太明白,例如:

enter image description here

带有tildas的文件都是功能性的mp3,但是对于它们的MIME类型都返回null,这对于正常运行的mp3是不利的,所以我很好奇是否有任何简单的解决方法来处理名字中带有特殊字符的文件。

2 个答案:

答案 0 :(得分:4)

因为你的文件名中有“〜”字符。

查看getFileExtensionFromUrl的实现

/**
 * Returns the file extension or an empty string iff there is no
 * extension.
 */

public static String getFileExtensionFromUrl(String url) {
    if (url != null && url.length() > 0) {
        int query = url.lastIndexOf('?');
        if (query > 0) {
            url = url.substring(0, query);
        }
        int filenamePos = url.lastIndexOf('/');
        String filename =
            0 <= filenamePos ? url.substring(filenamePos + 1) : url;

    // if the filename contains special characters, we don't
    // consider it valid for our matching purposes:
    if (filename.length() > 0 &&
        Pattern.matches("[a-zA-Z_0-9\\.\\-\\(\\)]+", filename)) { // <--
        int dotPos = filename.lastIndexOf('.');
        if (0 <= dotPos) {
            return filename.substring(dotPos + 1);
        }
    }
}

return "";

}

一种可能的解决方案是使用更宽的匹配规则编写自己的方法实现。 希望这有帮助

答案 1 :(得分:2)

由于这是您真正需要使用getMimeTypeFromExtension(..)的扩展程序,因此您只需使用lastIndexOf(".")将扩展名作为File.getAbsolutePath()的“子字符串”即可自行尝试。