如何拦截webView中的链接请求?

3
我有一个包含Facebook按钮的WebView,它会打开一个已经发布的链接。我想知道如何拦截请求并在Facebook应用程序中打开链接,而不是在浏览器中打开。但是,如果智能手机上已安装了Facebook应用程序,则可以直接打开。

谢谢您的回复,对我的英语水平感到抱歉。

4个回答

14
可以通过设置webviewclient实现这一点,例如。
mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("http://blablablacatchurl")) {

            //we have intercepted the desired url call
            return true;
        }

        return super.shouldOverrideUrlLoading(view, url);
    }
});

如果您想查看是否有一种深度链接到Facebook应用程序的方式,请将URL打包到一个Intent中并启动它,然后查看响应。如果Facebook没有截获它,我认为您无法以其他方式执行您请求的第二部分。


我测试了这个想法,对于 Facebook 链接来说很好,但是我的所有其他链接都在我的 Webview 中打开,而不是像期望的那样在浏览器中打开。可以通过为每个链接设置一个“if”来解决这个问题,但是没有更好的想法吗? - Setsuna
添加一个else子句,将URL打包到新的意图中并触发它,然后返回true,以便Webview不会加载该URL。 - Pork 'n' Bunny
我太傻了,没有想到,我不应该醒着,谢谢你的帮助。 - Setsuna

1
webView.setWebViewClient(new MyWebClient());

    private class MyWebClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            //return super.shouldOverrideUrlLoading(view, url);
            Uri uri;

            try {
                uri = Uri.parse(url);
            } catch (NullPointerException e) {
                // let Android deal with this
                return true;
            }

            String host = uri.getHost(); //Host is null when user clicked on email, phone number, ...

            if (host != null && host.equals("stackoverflow.com")) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            else {
                // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs or anything else (email, phone number, ...)
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);
                return true;
            }
        }
     }

1
如果 shouldOverrideUrlLoading 方法没有被触发,你可以重写 onPageStarted 或 shouldInterceptRequest 方法。它们都有 WebView 作为方法参数,因此你可以重定向 WebView。但是,如果你想要访问 WebView,它必须是 final 的,并且应该在不同的线程上运行。
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, WebResourceRequest request) {
    Log.i(TAG, "shouldInterceptRequest loading " + request.getMethod() + " " + request.getUrl().toString());
    String url = request.getUrl().toString();
    request.getRequestHeaders();
    if (url.contains("something important")){
        view.post(new Runnable() {
            @Override
            public void run() {
                if (view.canGoBack())
                    view.goBack();
                else
                    Log.e(TAG, "can NOT go back");
            }
        });
    }

    return super.shouldInterceptRequest(view, request);
}

0
你应该使用WebViewClient类并重写URL加载。

与上述提到的问题相同 :)。 - Setsuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接