3

我正在开发一个处理某些 http(s) 链接意图的 Android 应用程序。它在大多数情况下都有效,但不适用于点击 Chrome 中的链接,因为这个错误/缺失功能。简而言之,Chrome 不会广播这些点击的意图。:/

这可能最终会得到解决,但与此同时,有人知道解决方法吗?

如果我自己控制链接,我可以使用我自己的 HTTP 方案,例如 myapp://...,或者我可以使用 JavaScript 来伪造一个按钮单击,两者都发送意图...但我无法控制链接。

具体来说,我想处理http://github.com/snarfed 之类的链接。我的活动定义AndroidManifest.xml如下。它正确地接收来自其他应用程序的此类链接点击的意图广播,而不是来自 Chrome。

<activity android:name="MyApp" android:exported="true">
  <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" />
    <data android:scheme="https" />
    <data android:host="github.com" />
  </intent-filter>
</activity>
4

2 回答 2

9

您需要在每个数据点中包含方案、主机和路径前缀。

适当清单的示例:

<activity
    android:name=".PhotostreamActivity"
    android:label="@string/application_name">

    <!-- ... -->            

    <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="flickr.com"
              android:pathPrefix="/photos/" />
        <data android:scheme="http"
              android:host="www.flickr.com"
              android:pathPrefix="/photos/" />
    </intent-filter>
</activity>

此示例取自 Romain Guy 放在一起的应用程序,并在此处的重复问题中引用:

从浏览器拦截链接以打开我的 Android 应用程序

需要注意的几个注意事项,似乎您需要在意图映射生效之前在后台杀死 Chrome,如果您直接输入 url,应用程序将不允许使用它,只有当它是一个链接时 Chrome 才提供对应用程序的操作。

于 2013-07-24T12:26:30.170 回答
4

似乎只有当意图过滤器具有路径、pathPrefix 或 pathPattern 时,Chrome 才会触发意图。因此,为了过滤整个域,我通过添加解决了这个问题android:pathPattern=".*",如下所示:

<intent-filter
    android:priority="999">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
        android:host="mydomain.com"
        android:scheme="http"
        android:pathPattern=".*" />
    <data
        android:host="www.mydomain.com"
        android:scheme="http"
        android:pathPattern=".*" />
</intent-filter>
于 2013-11-23T16:09:36.323 回答