2012-08-06 47 views
1

我有一個包含Facebook按鈕的WebView,它會打開一個鏈接到已發佈帖子的網站。 我想知道如何攔截請求並在facebook應用程序而不是瀏覽器中打開它。但是,如果Facebook應用程序在智能手機上。如何攔截webView中的鏈接請求?

謝謝您的回覆,並對我的英文媒體感到抱歉。

回答

10

這可以通過設置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沒有收到它,我認爲你不能以任何其他方式執行你的請求的第二部分。

+0

我測試了這個想法不同的線程中運行,它是良好的Facebook的鏈接,但我所有的其他環節在我的網頁流量,而不是在打開根據需要使用瀏覽器。 這個問題可以通過爲每個鏈接放置一個「if」來處理,但是沒有更好的主意? – Setsuna 2012-08-06 09:50:12

+0

添加一個else子句,將url打包成一個新的意圖並將其關閉,然後返回true,以便webview不會加載url。 – 2012-08-06 09:54:54

+0

我很笨,因爲沒有想到,我不應該醒來,謝謝你的幫助。 – Setsuna 2012-08-06 10:00:44

0

您應該使用WebViewClient類並重寫URL加載。

+0

上面提到的同樣的問題:)。 – Setsuna 2012-08-06 09:51:30

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

在不費一槍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); 
}