我正在开发一款处理某些http(s)链接意图的Android应用。它适用于大多数情况,但不适用于Chrome中链接的点击,因为this bug/missing feature。简而言之,Chrome不会广播这些点击的意图。 :/
最终可能会修复,但与此同时,是否有人知道解决方法?
如果我自己控制链接,我可以使用自己的HTTP方案,例如myapp:// ...,或者我可以use JavaScript to fake a button click,两者都发送意图......但我不控制链接。
具体来说,我想处理像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>
答案 0 :(得分:9)
您需要在每个数据点中包含scheme,host和pathPrefix。
适当清单的示例:
<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放在一起的应用程序,并在此处重复提问:
Intercepting links from the browser to open my Android app
需要注意的几点需要注意,似乎你需要在意图映射生效之前在后台杀死Chrome。如果你直接输入网址,那么只有当它是一个链接时才会允许应用程序使用它Chrome会根据应用提供操作。
答案 1 :(得分:4)
如果intent过滤器有路径,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>