其实我知道如何通过我的自定义webview客户端通过URL过滤启动市场应用程序,但我想让它更通用,即检查每个URL,不仅是市场网址,还有一些其他网址协议webview不知道如何处理它,并启动ACTION_VIEW意图来处理它。
我想也许我可以检查网址是不是以“http”“https”“ftp”“mailto”开头,如果网址是这些协议,webview可以自己处理,对于其他人,我会启动一个新的Intent来尝试处理它。
你的想法是什么?我对么? 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;
}
});
答案 0 :(得分:6)
您可以尝试的一种方法是查看PackageManager.queryIntentActivities(Intent, int)
。此方法为您提供可处理给定Intent
的所有活动的信息。您只需创建一个Intent
并查看它返回的内容即可。如果您希望WebView
在处理URL时具有优先权,则可以选择处理包含浏览器活动的任何结果。我没有尝试过这段代码,但它可能看起来像:
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;
}
});