Фильтр намерений Android для определенного расширения файла? - PullRequest
86 голосов
/ 14 ноября 2009

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

<data android:path="*.ext" />

но я не мог заставить это работать.

Ответы [ 13 ]

2 голосов
/ 18 сентября 2018

Когда намерение соответствует intent-filter, это требования intent-filter: (представьте контрольный список).

  • Любое совпадение <action>
  • Любое совпадение <category>
  • Любое совпадение <data mimeType> (легко исправить: " / ")
  • По желанию:

    • Любое совпадение <data scheme> (легко исправить: <data android:scheme="file" /> <data android:scheme="content" />)

    • Любое совпадение <data host> (легко исправить: "*")

    • Любое совпадение <data pathPattern/etc.> (например, .*\\.0cc)

Определение нескольких элементов <data $type=""> проверяет поле $ type, если любое значение <data $type=> соответствует Intent.

Пропуск mimeType ломает ваш intent-filter, даже если он кажется излишним. Пропуск <data scheme/host/pathPattern> приводит к тому, что ваш фильтр соответствует всем.

https://f -droid.org / ru / packages / de.k3b.android.intentintercept / - приложение, разработанное для получения всех намерений и позволяющее вам проверить намерение. Я узнал, что нераспознанные расширения файлов, открытые через Simple File Manager, поставляются с MIME-типом application/octet-stream.

https://stackoverflow.com/a/4621284/2683842 сообщает, что <data pathPattern=> .*xyz прерывается в первый x, который он видит, и немедленно завершится ошибкой, если за ним не последует yz. Так что /sdcard/.hidden/foo.0cc не пройдет .*\\.0cc, если вы не попробуете .*\\..*\\.0cc.

  • Я не проверял, нужен ли этот обходной путь.

Конечный результат:

<activity android:name=".Ft2NsfActivity">

    <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:scheme="content" />
        <data android:host="*" />
        <data android:pathPattern=".*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\..*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\..*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\..*\\..*\\.0cc"/>
        <data android:mimeType="*/*" />
    </intent-filter>

</activity>
1 голос
/ 23 мая 2014

Использование фильтра, как показано ниже, для открытия из браузера, gmail и файлового браузера (протестировано). ПРИМЕЧАНИЕ. Пожалуйста, не объединяйте два фильтра, чтобы браузер игнорировал ваше приложение (протестировано).

        <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:pathPattern=".*\\.ext" android:mimeType="application/*"/>
            <data android:scheme="content" android:pathPattern=".*\\.ext" android:mimeType="application/*"/>
        </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="http"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />
            <data android:scheme="https"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />
            <data android:scheme="ftp"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />

        </intent-filter>
1 голос
/ 18 марта 2014

Если вы хотите, чтобы файлы открывались непосредственно из Gmail, Dropbox или любого из встроенных файловых инструментов Android, используйте следующий код (удалите 'android: host = "*"', который сделал файл недоступным для Gmail):

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="content" android:pathPattern=".*\\.kdb" 
          android:mimeType="application/octet-stream"/>


</intent-filter>

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="file" android:mimeType="*/*"     
          android:pathPattern=".*\\.kdb"/>
</intent-filter>

Фильтр данных должен быть записан в одном выражении согласно версии Android 4.x

...