Android Emulator中的HTTP代理适用于浏览器,而不适用于WebView

时间:2012-06-19 18:07:45

标签: android

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

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

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

并支持平台通知:

WebView.enablePlatformNotifications();

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

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

1 个答案:

答案 0 :(得分:7)

查看android浏览器源代码,以下内容很清楚:

  1. WebViews可以访问“设置”中配置的HTTP代理主机名和端口。
  2. WebView(和应用程序)无法访问“设置”中配置的HTTP代理用户名和密码。
  3. WebView会像其他HTTP身份验证请求一样处理代理身份验证请求,触发所附onReceivedHttpAuthRequest的{​​{1}} WebViewClient设置为host"{proxy}:{port}"设置为空字符串。
  4. 浏览器使用自己的自定义对话框来处理身份验证请求,此对话框不会向其他应用程序公开。
  5. 因此,从Android浏览器复制代码和对话框布局的最简单方法是:

    1. res/layout/http_authentication.xml复制到您自己的项目中。
    2. 复制src/com/android/browser/HttpAuthenticationDialog.java
    3. res/values/strings.xml
    4. 复制相关字符串
    5. 创建一个实现realm的新类,并从com.android.browser.Controller复制WebViewClient方法。
    6. 将方法修改为不依赖于onReceivedHttpAuthRequestmPagesDialogHandler是您的活动。

      context
    7. 将此新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(); 用于您的网络视图。