Подтвердить что ты не робот

Связывание приложения с форматом 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?
4b9b3361

Ответ 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 файлов.