фильтр намерений для улавливания намерений при просмотре файлов *.ext

Я пытаюсь выяснить, какие фильтры намерений мне нужны, чтобы:

просмотреть файл или контент с расширением *.npk

Я прочитал множество статей stackoverflow о фильтрах намерений, но до сих пор не могу понять, что мне не хватает.

Например, когда это мой фильтр намерений, я ожидаю, что он поймает файлы с расширением «*.npk». Я знаю о баге с паттернами, поэтому добавил несколько строк данных, чтобы отловить пути, где перед .npk стоит 0-4 точки:

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

Когда я открываю файл из приложения Total Commander, он работает, и моя активность начинается, как и ожидалось (кстати, это работает, даже если у меня есть только один pathPattern=".*\\.npk", так что, возможно, упомянутая ошибка исправлена ​​в леденце на палочке) :

{act=android.intent.action.VIEW dat=file:///storage/emulated/0/Android/data/com.fletech.smartbaby.android.pro/files/npk/animal-water-he.npk typ=application/octet-stream flg=0x10000000 cmp=com.fletech.smartbaby.android/.CategorySliderActivity}

Однако я не могу заставить его работать из приложения Dropbox. Это «захваченное» намерение от logcat. Чтобы захватить его, я добавил android:mimeType="*/*", чтобы я мог выбрать свое приложение, теперь каждый файл (также .jpg) хочет открыть мое приложение.

{act=android.intent.action.VIEW dat=file:///storage/emulated/0/Android/data/com.dropbox.android/files/u123456/scratch/apk/nature_0.npk typ=application/octet-stream flg=0x10000003 cmp=com.fletech.smartbaby.android/.CategorySliderActivity (has extras)}

Я не понимаю, почему вышеупомянутый фильтр не улавливает это намерение. Единственная разница, которую я вижу между намерением Total Commander и намерением Dropbox, — это флаг, дополнительные функции, которые не должны иметь значения, ИМХО, и наличие 2 или 4 точек в пути перед расширением файла, но мой фильтр намерений должен позаботиться об этом. этого.

Примечание. Я разрабатываю и тестирую Lollipop, но хочу, чтобы он работал на API 9+.


person Gavriel    schedule 16.01.2015    source источник


Ответы (1)


После еще одного длительного периода проб и ошибок я обнаружил, что следующее решение работает. Мне пришлось добавить к элементам данных как android:host="*", так и android:mimeType="*/*". Похоже, в официальной документации Android есть некоторые несоответствия.

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