Как получить MIME-тип файлов со странным именем? - PullRequest
1 голос
/ 28 февраля 2012

Я пишу простой файловый браузер, который меняет значок, используемый для отображаемых файлов, в зависимости от типа файла 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Все файлы с тильдами являются функциональными mp3-файлами, но все возвращают ноль для их типов MIME, что не очень хорошо для функционирующих mp3-файлов, поэтому мне интересно, есть ли какой-нибудь простой обходной путь для файлов со специальными символами в их имени.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Это из-за символа "~" в ваших именах файлов.

Посмотрите на реализацию 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 "";

}

возможное решение было бы написатьВаша собственная реализация этого метода с более широким правилом соответствия.Надеюсь, это поможет

2 голосов
/ 28 февраля 2012

Поскольку это расширение, которое вам действительно нужно для работы с getMimeTypeFromExtension(..), вы можете попробовать получить его самостоятельно, просто используя lastIndexOf("."), чтобы получить расширение в качестве «подстроки» из File.getAbsolutePath().

...