2

我的开发环境落后和 HTTP 代理。在 Android 模拟器中,我可以在 wifi 首选项中设置我的代理地址和凭据。然后,当我在浏览器中查看该页面时,系统会提示我重新输入我指定的主机的凭据。不知道为什么我必须再次输入它们,但它可以工作并且我能够查看该页面。

然后我有一个带有 WebView 的应用程序,它加载相同的页面。该应用程序具有互联网权限:

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

并支持平台通知:

WebView.enablePlatformNotifications();

但是...当我尝试查看该页面时,我得到代理的错误页面,说用户名和密码输入不正确。这向我表明该应用程序正在成功读取代理地址,但就像浏览器没有读取凭据一样。然后,它无法在完成请求之前显示与浏览器要求凭据相同的对话框。

有没有办法启用这个对话框(它是内置的?)或手动指定代理详细信息的方法?

4

1 回答 1

7

翻看android浏览器源码,以下就很清楚了:

  1. WebView 可以访问设置中配置的 HTTP 代理主机名和端口。
  2. WebViews(和应用程序)无权访问设置中配置的 HTTP 代理用户名和密码。
  3. WebView 将代理身份验证请求视为其他 HTTP 身份验证请求,触发onReceivedHttpAuthRequest附加WebViewClient设置host"{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并复制onReceivedHttpAuthRequest.com.android.browser.Controller
  5. 将方法修改为不依赖mPagesDialogHandler. context是你的活动。

    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. 将此新WebViewClient功能用于您的 Web 视图。

于 2012-06-20T20:35:05.647 回答