android - 如何获取名称奇怪的文件的 MIME 类型?

标签 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 不利,所以我很好奇对于名称中包含特殊字符的文件是否有任何简单的解决方法。

最佳答案

这是因为文件名中的“~”字符。

看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 "";

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

关于android - 如何获取名称奇怪的文件的 MIME 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487405/

相关文章:

java - Firebase找不到引用的方法

android - 在 EditText 中阻止物理键盘输入

javascript - 无法加载 wasm 应用程序

Android Studio 2.0 Preview 升级问题

android - Espresso Wiremock 集成

android - 如何获取 View 的状态(启用/禁用)?

javascript - 根据 mimetype 按类型对文件进行排序的最佳方法

javascript - 如何仅使用 javascript 确定文档的 mime 类型?

python - 在 python 中添加一个 mimetype

mime-types - 为 html-email 声明 MIME 类型