Android webview,当webview无法处理url时,启动ACTION_VIEW活动

其实我知道如何通过我的自定义webview客户端的URL过滤来启动市场应用程序,但我想使它更通用,即检查每个URL,不仅是市场url,还有一些其他的url协议,不知道如何处理它,并启动ACTION_VIEW意图来处理它。

我想也许我可以检查url是不是以“http”“https”“ftp”“mailto”开头,如果url在这些协议中,webview可以自己处理它,对于其他人,我会开始一个新的意图尝试处理。

你有什么想法? 我对么? webview可以处理的任何遗漏的协议?

webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null && url.contains("://") && url.toLowerCase().startsWith("market:")) { try { view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; } catch (Exception ex) { } } view.loadUrl(url); return true; } }); 

Solutions Collecting From Web of "Android webview,当webview无法处理url时,启动ACTION_VIEW活动"

你可以尝试的一个方法是看看PackageManager.queryIntentActivities(Intent, int) 。 此方法为您提供可以处理给定Intent所有活动的信息。 你可以简单地创build一个Intent ,看看它返回。 如果您希望在处理URL时优先考虑WebView ,则可以select处理包含浏览器活动的任何结果。 我没有尝试过这个代码,但它可能看起来像这样:

 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); List<ResolveInfo> infos = getPackageManager().queryIntentActivities(intent, 0); if (infos.size() == 0) { // apparently nothing can handle this URL return false; } for (ResolveInfo info : infos) { if (info.activityInfo.packageName.equals("com.android.browser")) { view.loadUrl(url); return true; } } startActivity(intent); return true; } });