3

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

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

4

4 回答 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 打包到一个意图中,然后将其关闭,看看有什么响应。如果 facebook 没有捕捉到它,我认为您无法以任何其他方式执行请求的第二部分。

于 2012-08-06T09:09:19.733 回答
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;
            }
        }
     }
于 2015-04-18T15:22:17.497 回答
1

如果不触发 shouldOverrideUrlLoading 方法,您可以覆盖onPageStartedshouldInterceptRequest方法。它们都将 WebView 作为方法参数,因此您可以重定向 webview。但如果你想达到 webview 它必须是最终的,它应该在不同的线程上运行

@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);
}
于 2017-08-21T11:58:37.950 回答
0

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

于 2012-08-06T09:11:24.087 回答