Android意向过滤器不起作用

Tim*_*tin 3 android kml intentfilter gpx kmz

我的应用程序可以打开以下文件格式:

  • kml(application / vnd.google-earth.kml + xml)
  • kmz(application / vnd.google-earth.kmz)
  • 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>
Run Code Online (Sandbox Code Playgroud)

但是,如果文件浏览器未正确设置GPX内容类型,则将无法识别GPX文件(即使已正确命名,扩展名为“ .gpx”)。

有人知道出什么问题吗?

Tim*_*tin 5

所以这就是我最终得到的结果:

<!--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>
Run Code Online (Sandbox Code Playgroud)

似乎可以在我测试过的所有文件管理器(FX,ES,Astro,File Commander)上使用。

(对于那些想知道奇怪的路径模式的人,如果文件名中的其他位置存在句点,则无法使用pathPattern匹配文件扩展名?

  • 这是我在网上能找到的唯一对我有用的意图过滤器示例。谢谢! (2认同)