我希望能够在用户点击给定模式的URL而不是允许浏览器打开它时提示我的应用打开链接。这可能是用户在浏览器中的网页上,电子邮件客户端中或在新鲜出炉的应用程序中的WebView中。拦截浏览器中的链接以打开我的Android应用
例如,从手机中的任意位置点击YouTube链接,您就有机会打开YouTube应用。
我该如何实现我自己的应用程序?
我希望能够在用户点击给定模式的URL而不是允许浏览器打开它时提示我的应用打开链接。这可能是用户在浏览器中的网页上,电子邮件客户端中或在新鲜出炉的应用程序中的WebView中。拦截浏览器中的链接以打开我的Android应用
例如,从手机中的任意位置点击YouTube链接,您就有机会打开YouTube应用。
我该如何实现我自己的应用程序?
使用类别android.intent.category.BROWSABLE的android.intent.action.VIEW。
从罗曼盖伊的Photostream应用程序的AndroidManifest.xml,
<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>
一旦进入你的activity的时候,你需要寻找的动作,然后做你已经交到URL的东西。 Intent.getData()
方法给你一个Uri。
final Intent intent = getIntent();
final String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
final List<String> segments = intent.getData().getPathSegments();
if (segments.size() > 1) {
mUsername = segments.get(1);
}
}
应当注意的是,这个应用程序是越来越有点过时(1.2)的,所以你会发现有实现这一目标的更好的方法。
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
setUrlparams(url);
if (url.indexOf("pattern") != -1) {
// do something
return false;
} else {
view.loadUrl(url);
}
return true;
}
}
谢谢。在你拥有webview的情况下,这很有用。我问的问题是如何获取我的应用程序拦截任何应用中链接的点击(例如,浏览器)。 – jamesh 2010-01-17 01:21:35
有一些库自动从url解析参数。如
https://github.com/airbnb/DeepLinkDispatch
& &
https://github.com/mzule/ActivityRouter
后来的一出由我写的。哪些可以解析给定类型的参数,并不总是String。
例
@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);
有一点要注意的 - 您的用户将使用合适的应用程序,因为所有你做的是应用程序注册你的处理器的选择呈现。个人(作为用户)我很恼火,但我意识到我可以选择“默认操作” – Bostone 2009-10-22 22:25:17
这不适用于HTC手机。我如何使它在HTC手机上工作? – user484691 2012-09-18 18:39:36
如果您关心包含查询字符串的完整URL,您可能会想要使用intent.getDataString()而不是getData()。这个评论会节省你花费我的时间..... :-( – 2012-10-30 13:26:11