如何处理intent://在一个webView的URL?

我目前正在开发一个带有webViewandroid应用程序。 在一些urls我需要使用shouldOverrideUrlLoading方法,这非常简单:

 if(url.startsWith("something")){ //do something return true; } 

我的问题:

在谷歌search的例子中,一些URLS有以下URLscheme:

 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 } 

我应该如何处理这种URLscheme?


更新:

在@CommonsWare评论之后,我试着用Intent parseUri()URL创build一个Intent object ,然后尝试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) } 

我可能得到的指示错误,或者我根本无法构build@CommonsWare指定的intent 。 有关如何构buildIntent任何提示?

Solutions Collecting From Web of "如何处理intent://在一个webView的URL?"

这个意图URL的结构在这里描述https://developer.chrome.com/multidevice/android/intents

所以我们可以像这样在内部WebView中处理它:

 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("intent://")) { try { Context context = view.getContext(); Intent intent = new 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; } 

我设法解决这个问题的方式并不高雅,但是可行。

首先,我们检查URL是否以intent:// startsWith intent://并且包含scheme=http ,如果是的话,我们在意图之后得到正确的值:// everything until#并将它传递给Intent.ACTION_VIEW ,否则return false (忽略点击)。
我已经用谷歌手机search的几个结果,如Twitter脸谱谷歌地图维基百科testing这个解决scheme,它的工作完美无瑕。

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

如果你有更好的解决scheme,我想听听。
谢谢大家的支持,特别是CommonsWare 。