Android WebView - с проверенным прокси - PullRequest
4 голосов
/ 23 ноября 2011

В настоящее время я пытаюсь отладить приложение для Android, построенное на основе WebView.Сетевая среда разработки, с которой мне приходится иметь дело (не мой выбор, это «решение по безопасности предприятия») - это WPA WiFi + прокси-сервер + аутентификация прокси.

В то время как инструкции для оченьполезный предыдущий ответ было здорово, я пытаюсь найти способ настроить оба прокси-хоста: порт и имя пользователя: пароль.

Мои ограничения:

  • Телефон не рутирован - попытка воспроизвести сообщенную клиентом ошибку, скорее всего, не будет отклоняться от типичной настройки клиента
  • Запуск Samsung Galaxy S на Froyo
  • Встроенный 2.1

Приложения для Android - не моя обычная вещь, опять же, не мой выбор, поэтому, если я явно упускаю детали, будьте милы;)

Ответы [ 2 ]

6 голосов
/ 25 мая 2012

С конфигурацией прокси Android для WebView , для базовой проверки подлинности с использованием превентивного прокси,

Начиная с Android 2.2, для аутентификации можно установить дополнительный заголовок. Следующее может добавить заголовок для http-запроса webView:

    public void loadUrl(WebView view, String url, String proxyUserName, String proxyPassword){
            UsernamePasswordCredentials creds= new UsernamePasswordCredentials(proxyUserName, proxyPassword);
            Header credHeader = BasicScheme.authenticate(creds, "UTF-8", true);
            Map<String, String> header = new HashMap<String, String>();
            header.put(credHeader.getName(), credHeader.getValue());
            view.loadUrl(url, header);
    }

Для более старой версии приоритетная аутентификация прокси может быть установлена ​​на mProxyUserName и mProxyPassword в android.webkit.Network с помощью отражения:

public void loadUrl(WebView view, String url, String proxyUserName, String proxyPassword){
    try{
        Class networkClass = Class.forName("android.webkit.Network");
        if (networkClass != null) {
            Object networkObj = invokeMethod(networkClass, "getInstance", new Object[]{view.getContext()}, Context.class);
            if (networkObj != null) {
                Field mProxyUserName = obj.getClass().getDeclaredField("mProxyUserName");
                mProxyUserName.setAccessible(true);mProxyUserName.set(networkObj, proxyUserName);
                Field mProxyPassword = obj.getClass().getDeclaredField("mProxyPassword");
                mProxyPassword.setAccessible(true);mProxyPassword.set(networkObj, proxyPassword);                       
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    view.loadUrl(url);
}

Когда вы загружаете новый URL, оба loadUrl() должны снова позвонить. Это очень важно. Следовательно, пользовательский WebViewClient должен использоваться для переопределения shouldOverrideUrlLoading(WebView view, String url)

class ProxyAuthWebViewClient extends WebViewClient {
    String proxyUserName;
    String proxyPassword;
    public ProxyAuthWebViewClient(String proxyUserName, String proxyPassword){
        this.proxyUserName = proxyUserName;
        this.proxyPassword = proxyPassword;
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        loadUrl(view, url, proxyUserName, proxyPassword);
        return true ;
    }
}

И установите WebViewClient на вашем webView:

webView.setWebViewClient(new ProxyAuthWebViewClient("user", "password"));
0 голосов
/ 18 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...