Android: ошибка типа контента при использовании ACTION_VIEW с локальным файлом - PullRequest
0 голосов
/ 26 апреля 2011

Я пытаюсь опубликовать уведомление, которое позволяет пользователю открыть локально сохраненный файл. Мой код выглядит так:

Intent notificationIntent = new Intent(Intent.ACTION_VIEW);
notificationIntent.setAction(android.content.Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(filename));
notificationIntent.setData(uri);

Где "filename" - это полный путь к локально сохраненному файлу, обычно в каталоге /mnt/sdcard/download. Файлы, которые я хочу отобразить, имеют различные типы: изображения, документы PDF, HTML и т. Д.

Это работает, но иногда Android пытается открыть файл как неправильный тип. Например, файл jpeg откроется в представлении веб-браузера, и вместо просмотра изображения я вижу двоичные данные из файла, отображаемые в виде текста. В других случаях это работает файл. Например, некоторые файлы PDF правильно открываются в программе просмотра PDF, а некоторые нет.

Я не уверен, почему это так. В документации сказано, что я не должен передавать явный тип контента. Если я установлю тип содержимого явно, все будет работать нормально. Проблема в том, что я не всегда знаю, каким должен быть тип контента (файл загружается из внешнего источника и может быть любым, и нет, тип MIME отсутствует в заголовках HTTP, я проверял это).

Что я могу сделать здесь? Есть ли какая-нибудь функция, которую я могу вызвать с именем файла, чтобы Android возвращал мне лучший тип контента для этого файла? Кроме того, почему это не происходит автоматически при обработке Намерения?

Спасибо.

1 Ответ

3 голосов
/ 26 марта 2012

Вы, скорее всего, поняли это; Я пишу на тот случай, если кто-то еще застрянет на этом. Я делаю следующее, чтобы получить mime-тип файла:

//Get the file path
Uri path = Uri.fromFile(file);
MimeTypeMap type_map = MimeTypeMap.getSingleton();
//Get the extension from the path
String extension = MimeTypeMap.getFileExtensionFromUrl(path.toString());
extension = extension.toLowerCase();
if (extension.contains(".")) {
    extension = extension.substring(extension.lastIndexOf("."));
}
String mime_type = type_map.getMimeTypeFromExtension(extension);
...