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

vir*_*sir 10 android protocols webview google-play

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

我想也许我可以检查网址是不是以"http""https""ftp""mailto"开头,如果网址是这些协议,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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

kab*_*uko 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;
    }
});
Run Code Online (Sandbox Code Playgroud)