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

我希望能够提示我的应用程序打开一个链接,当用户点击一个给定的模式的url,而不是让浏览器打开它。 这可能是当用户在浏览器中的网页上,或者在电子邮件客户端中,或者在新鲜出炉的应用程序中的WebView中。

例如,点击手机中的任意位置的YouTube链接,您就有机会打开YouTube应用。

我如何实现这个我自己的应用程序?

使用类别为android.intent.category.BROWSABLE的android.intent.action.VIEW 。

从Romain Guy的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> 

一旦进入活动 ,您需要查找相应的操作,然后使用您提交的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),所以你可能会发现有更好的方法来实现这一点。

有一些库自动从urlparsing参数。

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

后面的一个是我写的。 哪些可以parsing给定types的参数,并不总是string。

 @Router(value = "main/:id" intExtra = "id") ... int id = getIntent().getInt("id", 0); 
 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; } }