Nano Hash - криптовалюты, майнинг, программирование

Проблема HTTPClient Android 6.0 с телефоном LG G3

Привет, я использую класс DefaultHTTPClient для создания http-запроса.

Текущий метод execute() работает на всех телефонах, включая Nexus и Samsung с Android 6.0.

Но когда я тестировал телефоны LG с обновлением Android 6.0, я получаю сообщение об ошибке, как показано ниже.

 Java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.auth.DigestScheme.isGbaScheme(DigestScheme.java:210)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:176)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.DefaultRequestDirector.processChallenges(DefaultRequestDirector.java:1097)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:980)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:490)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
03-28 17:21:17.040: E/xx_SDK(14035):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
03-28 17:21:17.040: E/xx_SDK(14035):  at java.lang.Thread.run(Thread.java:818)

Я пытался понять, в чем проблема, речь идет о дайджест-аутентификации.

Я знаю, что из Android 6.0 они удалили клиент Apache Http и теперь используют класс HTTPUrlConnection.

Я попытался скопировать файл "org.apache.http.legacy.jar" из SDK в папку библиотеки моего проекта.

Но все же я сталкиваюсь с тем же журналом ошибок. Я надеюсь, что кто-то может помочь мне справиться с этой проблемой.

Пожалуйста, найдите код приложения как есть:

HttpParams params = new BasicHttpParams();
ClientConnectionManager connectionManager = null;
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);     
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
connectionManager = new SingleClientConnManager(params, registry);
}
catch (Exception e)
 {
  Log.e(TAG, Log.getStackTraceString(e));
 }

 ConnManagerParams.setTimeout(params, mTimeOut);
 HttpConnectionParams.setSoTimeout(params, mTimeOut);
 HttpConnectionParams.setConnectionTimeout(params, mTimeOut);
 HttpConnectionParams.setTcpNoDelay(params, true);

 DefaultHttpClient client = new DefaultHttpClient(connectionManager, params);

client.getCredentialsProvider().setCredentials(new AuthScope(host,port),
new UsernamePasswordCredentials(userID,passowrd));

client.setRedirectHandler(new RedirectHandler() {
@Override
public boolean isRedirectRequested(HttpResponse response, HttpContext context) {
}
@Override
public URI getLocationURI(HttpResponse response, HttpContext context) throws ProtocolException {
}

try {
HttpGet httpget = new HttpGet(url);
HttpResponse response = client.execute(httpget);  // issue occur here

Ответы:


1

Столкнулся с чем-то похожим и имел исправление, которое я пытаюсь добавить в еще один вопрос


Сегодня я столкнулся с похожей проблемой и только начал использовать HttpClient для Android< /а>

  1. Добавлена ​​зависимость compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1' для build.gradle.
  2. Замените new DefaultHttpClient() на HttpClientBuilder.create().build()

Возможно, вам потребуется выполнить некоторые другие незначительные рефакторинги в других частях кода, но это должно быть довольно прямолинейно.

07.04.2016
  • Я использовал библиотеку в соответствии со спецификацией Android 6.0. useLibrary org.apache.http.legacy.jar . Я вижу, что он отправляет http-запрос. сервер отвечает кодом 401, и мы снова отправляем с дайджест-аутентификацией. Если вы видите журнал ошибок, я чувствую некоторую проблему с параметрами дайджеста. А пока не могли бы вы рассказать мне, как использовать ваш новый код. Я не могу понять, как изменить DefaultClient. Ваш второй пункт не ясен 12.04.2016
  • Я также использовал устаревшую банку, но по-прежнему получал сообщение об ошибке только на LG G5 и LG G3. Я не вижу примера кода, поэтому предполагаю, что у вас есть место, где вы используете DefaultHttpClient из библиотеки apache. Если вы добавите новую зависимость, вам необходимо обновить код, в котором вы используете DefaultHttpClient, чтобы использовать HttpClientBuilder, прежде чем делать запрос. Это будет использовать новый код в httpclient-android и должно корректно обрабатывать параметры дайджеста. 13.04.2016
  • Большое спасибо за ваши комментарии. Я очень рад видеть вашу поддержку. Это очень важный вопрос для меня. Согласно вашему комментарию, я обновил код своего приложения. Теперь вы можете увидеть код выше. Пожалуйста, поддержите меня в том, как изменить этот код в соответствии с HttpClientBuilder. 14.04.2016
  • Я смог исправить ошибку телефона lg, используя ответ, который вы мне дали, и упомянутую библиотеку. Все работает нормально, пока я не увидел, что соединение HTTPS не работает. Я не могу заставить приложение работать при использовании HTTPS. Поэтому я добавил для него новый вопрос. stackoverflow.com/questions/36677494/. Пожалуйста, помогите мне исправить проблему с ssl, используя новую библиотеку. 17.04.2016

  • 2

    Попробуйте что-нибудь подобное, у меня была похожая проблема на MotoX с 6.0.1, но, похоже, это работает для меня.

     protected static final int HTTP_JSON_TIMEOUT_CONNECTION = 20000;
     protected static final int HTTP_JSON_TIMEOUT_SOCKET = 20000;
    
     CloseableHttpResponse response = null;
       try {
            UserPrefs.clearCacheFolder(mContext.getCacheDir());
            CloseableHttpClient httpClient = getApacheHttpClient();
            HttpPost httpPost = getHttpPost( invocation);
    
           response = httpClient.execute(httpPost);
        }catch (Exception e){
            e.printStackTrace();
        }
    
    
        protected CloseableHttpClient getApacheHttpClient(){
        try {
            // Socket config
            SocketConfig socketConfig = SocketConfig.custom()
                    .setSoTimeout(HTTP_JSON_TIMEOUT_SOCKET)
                    .build();
            // Auth
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(new AuthScope(URL, PORT, null, "Digest"),
                    new UsernamePasswordCredentials(USERNAME,DIGEST_PASSWORD));
            // Build HttpClient
            return HttpClients.custom()
                    .setDefaultSocketConfig(socketConfig)
                    .setDefaultCredentialsProvider(credentialsProvider)
                    .build();
        }catch (Exception e) {
            Log.i("ApacheHttpClientHelper", "ERROR >> "+e.getMessage());
            return null;
        }
    }
    

    Также вставьте это в градиент под зависимостями

      compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
    
    13.05.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..