I'd like to be able to prompt my app to open a link when user clicks on an URL of a given pattern instead of allowing the browser t开发者_StackOverflow中文版o open it. This could be when the user is on a web page in the browser or in an email client or within a WebView in a freshly-minted app.
For example, click on a YouTube link from anywhere in the phone and you'll be given the chance to open the YouTube app.
How do I achieve this for my own app?
Use an android.intent.action.VIEW of category android.intent.category.BROWSABLE.
From Romain Guy's Photostream app's 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>
Once inside you're in the activity, you need to look for the action, and then do something with the URL you've been handed. The Intent.getData()
method gives you a 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);
}
}
It should be noted, however, that this app is getting a little bit out of date (1.2), so you may find there are better ways of achieving this.
There are some libraries parse parameters from url automatically.
such as
https://github.com/airbnb/DeepLinkDispatch
&&
https://github.com/mzule/ActivityRouter
The later one is wrote by me. Which can parse parameters to given type, not always String.
Example
@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;
}
}
精彩评论