2016-09-02 15 views
2

мое приложение может открывать следующие форматы файлов:Android Намерение фильтр не работает

  • KML (приложение/vnd.google-earth.kml + XML)
  • КМЗ (приложение/vnd.google-земля. КМЗ)
  • GPX (приложение/GPX + XML)

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

  • HTTP
  • HTTPS
  • файл
  • содержание

я ожидал бы следующий фильтр, чтобы поймать всех случаях (за исключением файлов с точками в имени, но это уже другая проблема):

<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="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:pathPattern=".*\\.kml" /> 
    <data android:pathPattern=".*\\.kmz" /> 
    <data android:pathPattern=".*\\.gpx" /> 

    <data android:mimeType="application/vnd.google-earth.kml+xml" /> 
    <data android:mimeType="application/vnd.google-earth.kmz" /> 
    <data android:mimeType="application/gpx+xml" /> 

</intent-filter> 

Но если файловый проводник не устанавливает надлежащим образом тип содержимого GPX, GPX файлы не распознаются (даже если они правильно названы, с расширением «.gpx»).

Кто-нибудь знает, в чем проблема?

+0

Я бы установить это, как два фильтра. Один из них - «файл» и расширения. Другая - другие схемы и типы MIME. Например, если контент имеет правильный тип MIME, но в пути нет одного из этих расширений (как это редко бывает для 'content'), ваш фильтр не будет соответствовать. В общем случае расширения файлов являются наименее надежным подходом на Android. – CommonsWare

+0

Спасибо! Я почти там, у меня есть кое-что, что, кажется, обрабатывает все случаи. Почему вы ограничиваете схему на 2 фильтрах? Почему бы не один фильтр для расширений и один для типов mime, как для всех схем? –

+0

Ну, для 'http' и' https', тип MIME был бы более надежным IMHO. Для 'content' часто не существует расширения файла. Я склонен придерживаться подхода использования меньшего объема, который с меньшей вероятностью даст мне ошибочные результаты. Но, если вы хотите применить все четыре схемы в обоих фильтрах, это, вероятно, работает. – CommonsWare

ответ

3

Так вот, что я закончил с:

<!--Mime type set --> 
<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="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <!-- Valid mime types --> 
    <data android:mimeType="application/vnd.google-earth.kml+xml" /> 
    <data android:mimeType="application/vnd.google-earth.kmz" /> 
    <data android:mimeType="application/gpx+xml" /> 

    <!-- Invalid mime types used by some bad software --> 
    <data android:mimeType="application/kml" /> 
    <data android:mimeType="application/kmz" /> 
    <data android:mimeType="application/gpx" /> 

    <data android:mimeType="application/kml+xml" /> 
    <data android:mimeType="application/kmz+xml" /> 

    <data android:mimeType="application/vnd.google-earth.kml" /> 
    <data android:mimeType="application/vnd.google-earth.gpx" /> 
    <data android:mimeType="application/vnd.google-earth.kmz+xml" /> 
    <data android:mimeType="application/vnd.google-earth.gpx+xml" /> 

    <data android:mimeType="text/kml" /> 
    <data android:mimeType="text/kmz" /> 
    <data android:mimeType="text/gpx" /> 

    <data android:mimeType="text/kml+xml" /> 
    <data android:mimeType="text/kmz+xml" /> 
    <data android:mimeType="text/gpx+xml" /> 

    <data android:mimeType="text/xml+kml" /> 
    <data android:mimeType="text/xml+kmz" /> 
    <data android:mimeType="text/xml+gpx" /> 

</intent-filter> 

<!-- Mime type not set but valid extensions --> 
<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="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:host="*" /> 

    <data android:pathPattern="/.*..*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*\\.kml" /> 
    <data android:pathPattern="/.*..*\\.kmz" /> 
    <data android:pathPattern="/.*\\.gpx" /> 
    <data android:pathPattern="/.*\\.kml" /> 
    <data android:pathPattern="/.*\\.kmz" /> 

</intent-filter> 

<!-- Invalid mime type but valid extensions --> 
<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="http" /> 
    <data android:scheme="https" /> 
    <data android:scheme="content" /> 

    <data android:host="*" /> 
    <data android:mimeType="*/*" /> 

    <data android:pathPattern="/.*..*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*..*\\.kml" /> 
    <data android:pathPattern="/.*..*..*\\.kmz" /> 
    <data android:pathPattern="/.*..*\\.gpx" /> 
    <data android:pathPattern="/.*..*\\.kml" /> 
    <data android:pathPattern="/.*..*\\.kmz" /> 
    <data android:pathPattern="/.*\\.gpx" /> 
    <data android:pathPattern="/.*\\.kml" /> 
    <data android:pathPattern="/.*\\.kmz" /> 

</intent-filter> 

Кажется, что работает на всех файлового менеджера я тестировал (FX, ES, Astro, File Commander).

(Для тех, кому интересно о странных узоров пути см pathPattern to match file extension does not work if a period exists elsewhere in the file name?)

+0

Это работает для открытия вложений Gmail? –

+0

IIRC да, он делает! –