Android 如何在webView URL上处理intent://?

Android 如何在webView URL上处理intent://?,android,webview,Android,Webview,我目前正在开发一款带有webView的android应用程序。在一些URL上,我需要使用shouldOverrideUrlLoading方法,这非常简单: if(url.startsWith("something")){ //do something return true; } 我的问题: 例如,在谷歌搜索上,一些URL,具有以下URL方案: intent://en.m.wikipedia.org/wiki/Test_cricket#Intent;scheme=http;package=or

我目前正在开发一款带有
webView
的android应用程序。在一些
URL
上,我需要使用
shouldOverrideUrlLoading
方法,这非常简单:

if(url.startsWith("something")){
//do something
return true;
}
我的问题:

例如,在谷歌搜索上,一些
URL
,具有以下
URL
方案:

intent://en.m.wikipedia.org/wiki/Test_cricket#Intent;scheme=http;package=org.wikipedia;S.browser_fallback_url=https%3A%2F%2Fwww.google.pt%2Fsearchurl%2Fr.html%23app%3Dorg.wikipedia%26pingbase%3Dhttps%3A%2F%2Fwww.google.pt%2F%26url%3Dhttps%3A%2F%2Fen.m.wikipedia.org%2Fwiki%2FTest_cricket;S.android.intent.extra.REFERRER_NAME=https%3A%2F%2Fwww.google.pt;launchFlags=0x8080000;end
我试过使用:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
但我有一个错误:

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://en.m.wikipedia.org/wiki/Test_cricket }
我应该如何处理这种
URL
方案


更新:

在@commonware注释之后,我尝试在
Intent
上使用
parseUri()
URL
创建
Intent对象,然后尝试
startActivity()
,类似于:

Intent myIntent = new Intent().parseUri(url, Intent.URI_INTENT_SCHEME);
startActivity(myIntent);
但我仍然得到:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://en.m.wikipedia.org/wiki/Test_cricket flg=0x8080000 pkg=org.wikipedia (has extras) }
我可能是把指令弄错了,或者我根本无法按照@commonware指定的方式构造
意图
。关于如何构建
意图的任何提示都可以使用。

我设法解决这个问题的方法并不优雅,但确实有效

首先,我们检查url
是否以
intent://
开始,并包含
scheme=http
,如果是,我们将在intent://
之后立即获取值,直到#
所有内容,并将其传递给
intent.ACTION\u视图
,如果不是,我们
返回false
(忽略单击)。
我已经用谷歌移动搜索的几个结果测试了这个解决方案,比如,twitterfacebook谷歌地图维基百科,它工作得非常完美

@Override
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 = regexMatcherBkp.group(1);
            Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"+bkpUrl));
            startActivity(myIntent);
            return true;
        }else{
            return false;
        }
   }
return false;
}

如果您有更好的解决方案,我愿意听听。

特别感谢大家的支持。

此处介绍了此意向url的结构

因此,我们可以在内部WebView中处理它,如下所示:

@Override
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) {
                view.stopLoading();

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

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

在调用
startActivity()
之前,捕获
ActivityNotFoundException
或使用
PackageManager
resolveActivity()
检测此情况。在这种情况下,
Uri
是一个应用程序(Wikipedia),如果没有安装该应用程序,
Intent
将无法解析。您需要向用户显示某种错误消息,指出这一事实。@如果点击带有
intent://...
在它上面,一些浏览器(Firefox、Chrome、Opera)成功地打开了应用程序,有没有办法将uri转发到默认浏览器并让它处理?默认浏览器没有处理它——维基百科应用程序应该处理它。不过,现在我想起来,
ACTION\u VIEW
可能不是正确的答案。使用
Intent
上的
parseUri()
从URL创建
Intent
对象,然后在
Intent
上尝试
startActivity()
@commonware,这很有意义,让我试试。稍后我会通知您。@pedrobito:尝试将
BROWSABLE
category添加到您正在创建的意图对象中——这是浏览器实际执行的操作:
myIntent.addCategory(intent.category\u BROWSABLE)
看起来像是维基百科应用程序在其意图过滤器中指定了这个类别:完美!最后是一个解决方案注释:
view.stopLoading()
不是必需的,因为URL只有在该函数返回并返回true时才会开始加载。这可用于在Android WebView中显示Firebase短链接(例如Google地图URL)。。因为从webview,不会触发意图,也不会显示网页。