Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在webView中拦截链接请求?_Android_Facebook_Webview - Fatal编程技术网

Android 如何在webView中拦截链接请求?

Android 如何在webView中拦截链接请求?,android,facebook,webview,Android,Facebook,Webview,我有一个WebView,其中包含一个Facebook按钮,它打开了一个链接到该网站的帖子已经完成。 我想知道如何拦截请求并在facebook应用程序中打开它,而不是在浏览器上。但是,如果智能手机上有Facebook应用程序 感谢您的回复,并为我的英语媒体感到抱歉。这可以通过设置webviewclient eg来实现 mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOver

我有一个WebView,其中包含一个Facebook按钮,它打开了一个链接到该网站的帖子已经完成。 我想知道如何拦截请求并在facebook应用程序中打开它,而不是在浏览器上。但是,如果智能手机上有Facebook应用程序


感谢您的回复,并为我的英语媒体感到抱歉。

这可以通过设置webviewclient eg来实现

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没有抓到它,我认为你不能以任何其他方式执行请求的第二部分。

你应该使用WebViewClient类并覆盖url加载。

如果没有触发shouldOverrideUrloding方法,你可以覆盖
onPageStarted
shouldInterceptRequest
方法。它们都将WebView作为方法参数,因此您可以重定向WebView。但如果您想访问webview,它必须是最终版本,并且应该在不同的线程上运行

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

我测试了这个想法,它对facebook链接有好处,但我的所有其他链接都在我的webview中打开,而不是在浏览器中打开。这个问题可以通过为每个链接添加一个“if”来解决,但是没有更好的主意吗?添加一个else子句,将url打包成一个新的intent并启动它,然后返回true,这样webview就不会加载url。我很愚蠢,因为我没有想到,我不应该醒着,谢谢您的帮助。与上面提到的问题相同:)。