Я пишу основной файловый браузер, который меняет значок, используемый для файлов, отображаемых в зависимости от типа файла MIME, но мне трудно найти тип MIME для некоторых файлов, и я не уверен, почему код я Использование MIME-типа таким образом:
private String getFileMimeType(File file)
{
Uri fileUri = Uri.fromFile(file);
String ext = MimeTypeMap.getFileExtensionFromUrl(fileUri.toString());
return mtm.getMimeTypeFromExtension(ext);
}
Он работает для некоторого файла, но не для некоторых с более сложными символами в них, что я действительно не понимаю, например, ниже:
Файлы с tildas - это все функциональные mp3 файлы, но все возвращают null для своих MIME-типов, что плохо для функционирования 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 "";
}
возможным решением было бы написать собственное воплощение этого метода с более широким правилом сопоставления. Надеюсь это поможет
Поскольку это расширение, которое вам действительно нужно для работы с getMimeTypeFromExtension(..)
, вы можете попробовать получить его сами, просто используя lastIndexOf(".")
Чтобы получить расширение как "подстроку" из File.getAbsolutePath()
.