Связывание приложения с форматом Epub
Я не понимаю, как заставить мое приложение регистрироваться на epub файлах на мобильном устройстве. У меня есть набор фильтров намерений в манифесте Android, но он все равно не будет открыт с файлами epub на SD-карте. Когда я просматриваю приложение File Explorer
, он показывает файл, но когда я нажимаю на него, он говорит: "Система не поддерживает этот тип файла:". Когда я загружаю файл из Интернета, а затем перейду к папке загрузки с помощью приложения для загрузки, файл вообще не отображается (даже если он находится в папке загрузки в браузере файлов). Я также пытался получить epub файлы для отображения с намерением выбора файла (Intent.ACTION_OPEN_DOCUMENT
), но не повезло. Я предполагаю, что последние два не отображаются, потому что намерение загружается с помощью Intent.CATEGORY_OPENABLE
Я пробовал несколько файлов epub и все без успеха.
Может кто-нибудь помочь выяснить, что мне не хватает?
Использование KitKat и более высоких телефонов.
Примечание. Это работает с загрузкой из Интернета. Если я перейду к ссылке epub, это работает, но не из файловой системы.
<!-- Open File Types -->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:host="*" android:scheme="file"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:host="*" android:scheme="file" android:mimeType="text/plain"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="file"/>
<data android:mimeType="application/epub+zip"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="http"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="http" android:mimeType="text/plain"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="http"/>
<data android:mimeType="application/epub+zip"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="https"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="https" android:mimeType="text/plain"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="https"/>
<data android:mimeType="application/epub+zip"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="content"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="content" android:mimeType="text/plain"/>
<data android:pathPattern=".*\\.epub"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="content"/>
<data android:mimeType="application/epub+zip"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:scheme="book"/>
</intent-filter>
<intent-filter
android:icon="@raw/icon"
android:label="ePub File"
android:priority="1" >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="ftp" />
<data android:scheme="file" />
<data android:host="*" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.epub" />
</intent-filter>
Update:
Ищете ответы на следующие вопросы для награды:
- Как мне заставить систему Android распознавать, что файлы epub на внутреннем или внешнем хранилище можно открыть в моем приложении?
- Как получить браузер файлов по умолчанию (Storage Access Framework), чтобы показать файлы epub?
Ответы
Ответ 1
Как получить систему Android для распознавания того, что файлы epub на внутренней или внешней памяти можно открыть в моем приложении?
"Android-система" не имеет к этому никакого отношения, особенно сегодня.
Поддержка MimeTypeMap
(или, более точно, libcore.net.MimeUtils
из классов фреймворка) для .epub
/application/epub+zip
была добавлена ~ 35 часов назад, Предположительно, он появится в будущем выпуске Android. До этого единственными файловыми менеджерами, которые будут использовать этот тип MIME, являются те, которые добавили его сами.
На высоком уровне, столкнувшись с такой проблемой, решение довольно просто:
-
Найдите другое приложение, которое делает то, что вы хотите (в этом случае другой читатель EPUB)
-
Используйте приложение App Browser, чтобы посмотреть, как выглядит этот манифест приложения и что он выбрал для <intent-filter>
stanzas
В общем, я обычно вижу <intent-filter>
со схемой и типом MIME или структурой, хостом и файлом пути. Если тип MIME и не подходит, то путь к нему вряд ли поможет, как будто Intent
явно не имеет в нем тип MIME, и Android не знает о том, чтобы сопоставить это расширение с вашим MIME тип, ваш <intent-filter>
может не совпадать.
Кроме того, вам нужно будет протестировать несколько приложений "File Manager", поскольку у Android нет файлового менеджера, и поэтому вы можете испытывать ошибки/ограничения в том, что вы тестируете.
Как получить браузер файлов по умолчанию (Storage Access Framework) для отображения файлов epub?
Укажите правильный тип MIME и молитесь о чуде.
Опять же, пока сам Android не предложит немного более встроенной поддержки для сопоставления .epub
с типом MIME, вы полагаетесь на самих поставщиков хранилищ, которые знают, что .epub
сопоставляется с типом application/epub+zip
MIME. Некоторые поставщики будут, потому что они получают эту информацию от какого-то внутреннего сервера, который может знать больше типов MIME, чем сам Android. Некоторые провайдеры не могут, например, Android MediaStore
-backed провайдер, что на внешнем хранилище, поскольку я сомневаюсь, что MediaStore
имеет собственную локальную поддержку EPUB файлов.