【问题标题】:Android intent filter not workingAndroid意图过滤器不起作用
【发布时间】:2016-09-02 21:01:07
【问题描述】:

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

  • 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>

但如果文件资源管理器没有正确设置 GPX 内容类型,则无法识别 GPX 文件(即使它们已正确命名,扩展名为“.gpx”)。

有人知道问题出在哪里吗?

【问题讨论】:

  • 我会将其设置为两个过滤器。一个是file 和扩展名。另一个是其他方案和 MIME 类型。就目前而言,例如,如果内容具有正确的 MIME 类型,但路径没有这些扩展名之一(因为它很少用于 content),则您的过滤器将不匹配。通常,文件扩展名是 Android 上最不可靠的方法。
  • 谢谢!我快到了,我有一些似乎可以处理所有情况的东西。为什么要限制 2 个过滤器的方案?为什么不对所有方案都使用一种扩展过滤器和一种 MIME 类型过滤器?
  • 好吧,对于httphttps,恕我直言,MIME 类型会更可靠。对于content,通常没有文件扩展名。我倾向于采用较小范围的方法,这种方法不太可能给我错误的结果。但是,如果您想在两个过滤器中应用所有四种方案,那可能可行。
  • 好的,谢谢!我会照我说的做,我更喜欢让应用程序无法打开提供的文件,而不是应用程序不建议打开它可以处理的文件。

标签: android kml intentfilter gpx kmz


【解决方案1】:

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

<!--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?

【讨论】:

  • IIRC 是的!
  • 这是我能在网上找到的唯一一个对我有用的意图过滤器示例。谢谢!
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多