android – How to handle intent:// on a webView URL?-ThrowExceptions

Exception or error:

I’m currently developing an android app with a webView. On some urls I need to use the shouldOverrideUrlLoading method, which is pretty straight forward :

//do something
return true;

My problem:

Some URLS, on google search for example, have the following URL scheme :


I’ve tried using :

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

But I got an error:

10-15 15:18:15.546: W/System.err(29086): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=intent:// }

How should I handle this kind of URL scheme ?


Following @CommonsWare comments, I’ve tried using parseUri() on Intent to create an Intent object from the URL and then try startActivity(), something like:

Intent myIntent = new Intent().parseUri(url, Intent.URI_INTENT_SCHEME);

But I still get :

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat= flg=0x8080000 pkg=org.wikipedia (has extras) }

I may have got the instructions wrong or I’m simply unable to construct the intent as @CommonsWare specified. Any tips on how to construct the Intent?

How to solve:

Structure of this intent url is described here

So we can handle it in internal WebView like this:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("intent://")) {
        try {
            Context context = view.getContext();
            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);

            if (intent != null) {

                PackageManager packageManager = context.getPackageManager();
                ResolveInfo info = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
                if (info != null) {
                } else {
                    String fallbackUrl = intent.getStringExtra("browser_fallback_url");

                    // or call external broswer
//                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(fallbackUrl));
//                    context.startActivity(browserIntent);

                return true;
        } catch (URISyntaxException e) {
            if (GeneralData.DEBUG) {
                Log.e(TAG, "Can't resolve intent://", e);

    return false;


Comrade’s answer is the one to use.

The way I managed to solve this isn’t elegant but it works.

First we check if the url startsWith with intent:// and contains scheme=http, if so, we get the value right after intent://everything until# and pass it to Intent.ACTION_VIEW, if not, we return false (ignore click).
I’ve tested this solution with several results from google mobile search, such as, twitter, facebook, google maps and wikipedia and it worked flawlessly.

public boolean shouldOverrideUrlLoading( WebView view, String url) {
    if(url.startsWith("intent://") && url.contains("scheme=http")){
        url = Uri.decode(url);
        String bkpUrl = null;
        Pattern regexBkp = Pattern.compile("intent://(.*?)#");
        Matcher regexMatcherBkp = regexBkp.matcher(url);
        if (regexMatcherBkp.find()) {
            bkpUrl =;
            Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"+bkpUrl));
            return true;
            return false;
return false;

If you’ve a better solution, I would like to hear it.
Thank you all for the support, specially CommonsWare.

Leave a Reply

Your email address will not be published. Required fields are marked *