Множество файловых расширений / фильтры-мимики типа с одним действием - PullRequest
7 голосов
/ 09 февраля 2012

Gents,

Я пытаюсь получить его, чтобы мое приложение Android могло реагировать как на открываемые файлы (путем сопоставления их расширений), так и на mime-типы (чтобы они работали из браузера).

Я следовал совету здесь:

Фильтр намерений Android для определенного расширения файла?

, но все равно не повезло.

Соответствующий раздел из моего файла манифеста Android выглядит следующим образом:

<activity android:name="MuPDFActivity"
              android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/vnd.ms-xpsdocument"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/pdf"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="application/x-cbz"/>
        </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:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.xps"/>
            <data android:host="*"/>
        </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:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.pdf"/>
            <data android:host="*"/>
        </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:scheme="file"/>
            <data android:mimeType="*/*"/>
            <data android:pathPattern=".*\\.cbz"/>
            <data android:host="*"/>
        </intent-filter>
    </activity>

Как видите, я бы хотел, чтобы приложение вызывалось для файлов .pdf, .xps и .cbz,также файлы с соответствующими mimetypes.Локальные тесты здесь показывают, что разделы .pdf и application / pdf оба работают, но, как я мог бы попытаться, разделы .xps (и предположительно .cbz) - нет.?Может ли каждое действие иметь только один шаблон mimetype / file?

Любая помощь будет принята с благодарностью.

Спасибо,

Робин

Ответы [ 3 ]

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

afaik, это скорее так (один фильтр с различными значениями):

 <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.ms-xpsdocument"/>
        <data android:mimeType="application/pdf"/>
 </intent-filter>

Кроме того, возможно ли, что MIME-тип неправильный?

2 голосов
/ 18 декабря 2013

Несколько <data> являются логическими ИЛИ и рассматриваются отдельно. Таким образом, у вас есть один тег с android:scheme, но без android:pathPattern и один с android:pathPattern, но без android:host и так далее. Поэтому ни один из тегов <data> не является полным и не принесет пользы.

Вы должны использовать:

    <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:scheme="file"
          android:mimeType="*/*"
          android:pathPattern=".*\\.cbz"
          android:host="*"
        ></data>
    </intent-filter>

У вас может быть секунда <data>, но для этого потребуются все четыре атрибута, поскольку все четыре атрибута обязательны для Android 4, если вы хотите использовать android:pathPattern. (Они не были в более старых версиях Android)

0 голосов
/ 09 февраля 2012

Может ли каждое действие иметь только один шаблон mimetype / file?

Нет. По вашему собственному признанию, работают двое (PDF x 2).

Я что-то упускаю здесь очевидное?

Я сомневаюсь, что элемент BROWSABLE принесет вам много пользы от тех, на которых он есть, и вам он понадобится для остальных. BROWSABLE для браузеров, которые будут идти по пути MIME-типа.

...