Intercepting links from the browser to open my Android app

AndroidAndroid IntentIntentfilterUrl Interception

Android Problem Overview


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 to 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?

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

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);

Solution 3 - Android

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;
	}

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjameshView Question on Stackoverflow
Solution 1 - AndroidjameshView Answer on Stackoverflow
Solution 2 - AndroidCao DongpingView Answer on Stackoverflow
Solution 3 - AndroidDacxView Answer on Stackoverflow