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

标签 android webview protocols google-play

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

我想也许我可以检查一下url是否不是以“http”“https”“ftp”“mailto”开头的,如果url在这些协议(protocol)中,webview可以自己处理,对于其他人,我会启动一个新的 Intent 来尝试处理它。

你的想法是什么?我对么?是否缺少 webview 可以处理的协议(protocol)?

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

最佳答案

您可以尝试的一种方法是查看 PackageManager.queryIntentActivities(Intent, int) .此方法为您提供可以处理给定 Intent 的所有 Activity 的信息。您可以简单地创建一个 Intent 并查看它返回的内容。如果你想让你的 WebView 在它可以处理 URL 时优先,你可以选择处理任何结果,包括浏览器 Activity 。我没有尝试过这段代码,但它可能看起来像:

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

关于Android webview,当 url 无法被 webview 处理时启动 ACTION_VIEW Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325771/

相关文章:

android - 如何在pjsip中获取PJSUA_CALL_MEDIA_REMOTE_HOLD

java - Objectify with Endpoints for android

android - Cordova 应用程序突然无法正常工作

android - 覆盖 webview 中的视口(viewport)元数据属性 "user-scalable=no"以允许缩放

swift - 如何为类类型提供默认的下标协议(protocol)一致性?

android - 移动版 Chrome 中的 -webkit-calc()

Android 传感器 ListView

javascript - 带有 HTML 按钮和 JavaScript 的 Android WebView

ios - Swift:覆盖属性类型的协议(protocol)扩展

ios - 从协议(protocol)扩展中调用类属性