android - Android 模拟器中的 HTTP 代理适用于浏览器,不适用于 WebView

标签 android

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

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

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

并支持平台通知:

WebView.enablePlatformNotifications();

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

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

最佳答案

查看android浏览器源码,下面就明白了:

  1. WebView 可以访问设置中配置的 HTTP 代理主机名和端口。
  2. WebView(和应用)无权访问设置中配置的 HTTP 代理用户名和密码。
  3. WebView 像其他 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 是您的 Activity 。

    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 用于您的 WebView 。

关于android - Android 模拟器中的 HTTP 代理适用于浏览器,不适用于 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106769/

相关文章:

android - 项目上的 Recyclerview 单击将图像设置为 Activity 中的另一个 ImageView

Android WebView 链接颜色

javascript - 在 Android 电子邮件客户端中显示 HTML 标签的问题

javascript - window.location.href 是否具有服务器特定行为?

java - Android - 单选按钮单击事件转到新 Activity

Android Datepicker 对话框具有透明背景

android - getResources().getIdentifier 问题

php - 返回 JSON 格式的所有数据的单个 API 调用会比返回部分的多个 API 调用更快吗?

android - adb shell getevent 中 cdfinger_input 代表什么类型的事件

android - ScrollView 中的 NumberPicker