2012-06-19 107 views
2

我的開發環境是HTTP和代理。在Android模擬器中,我可以在wifi偏好設置中設置我的代理地址和憑證。然後,當我在瀏覽器中查看該頁面時,系統會提示重新輸入我指定的主機的憑據。不知道爲什麼我必須再次輸入它們,但它可以正常工作,並且我可以查看該頁面。Android模擬器中的HTTP代理適用於瀏覽器,不適用於WebView

然後我有一個WebView應用程序加載相同的頁面。該應用程序具有網絡權限:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

,並支持平臺通知:

WebView.enablePlatformNotifications(); 

但是...當我嘗試查看網頁,我得到了代理的錯誤頁面,指出用戶名和密碼均未進入正確。這表明該應用程序正在成功讀取代理地址,但像瀏覽器沒有讀取憑證。因此,在完成請求之前,它無法顯示與瀏覽器相同的對話框以詢問憑據。

有沒有辦法啓用這個對話框(內置?)還是手動指定代理詳細信息的方法?

回答

7

綜觀機器人瀏覽器源代碼,以下是明確的:

  1. 網頁視圖有權訪問HTTP代理主機名和端口如設置值進行配置。
  2. WebViews(和應用程序)無法訪問「設置」中配置的HTTP代理用戶名和密碼。
  3. 網頁視圖像對待其它HTTP認證請求代理認證請求,觸發附加WebViewClientonReceivedHttpAuthRequesthost集到"{proxy}:{port}"realm集合爲空字符串。
  4. 瀏覽器使用自己的自定義對話框來處理認證請求,並且此對話框不會暴露給其他應用程序。

因此,最簡單的方法,從Android瀏覽器複製代碼和對話框佈局:

  1. 複製res/layout/http_authentication.xml到自己的項目。
  2. 複製src/com/android/browser/HttpAuthenticationDialog.java
  3. 複製從res/values/strings.xml
  4. 相關的字符串創建一個實現WebViewClient一個新的類,並從com.android.browser.Controller複製onReceivedHttpAuthRequest方法。
  5. 將該方法修改爲不依賴於mPagesDialogHandlercontext是你的活動。

    HttpAuthenticationDialog dialog = new HttpAuthenticationDialog(context, host, realm); 
    
    dialog.setOkListener(new HttpAuthenticationDialog.OkListener() { 
        public void onOk(String host, String realm, String username, String password) { 
         handler.proceed(username, password); 
        } 
    }); 
    
    dialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() { 
        public void onCancel() { 
         handler.cancel(); 
        } 
    }); 
    
    dialog.show(); 
    
  6. 用於Web視圖這個新WebViewClient

+0

根據你的回答我得到對話框,輸入用戶名和密碼後,我無法登錄。我是否需要再次加載webview網址? –

相關問題