2

Bonjour, J'utilise la classe DefaultHTTPClient pour créer une requête http.Problème Android 6.0 HTTPClient avec le téléphone LG G3

La méthode execute() du code courant fonctionne sur tous les téléphones, y compris Nexus et Samsung avec Android 6.0.

Mais quand je l'ai testé sur les téléphones LG avec Android 6.0 mise à jour, je reçois l'erreur comme indiqué ci-dessous

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) 

J'ai essayé de comprendre ce problème, il parle de l'authentification Digest.

Je sais d'Android 6.0, ils ont supprimé le client Apache Http et utilise maintenant la classe HttpURLConnection

J'ai essayé de copier le « org.apache.http.legacy.jar » fichier de sdk à mon projet lib . Mais je suis toujours confronté au même journal d'erreurs. J'espère que quelqu'un pourra m'aider à m'intéresser à ce problème.

Veuillez trouver le code d'application comme il est:

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 

Répondre

2

tombé sur quelque chose de similaire et avait une solution, je suis en train que j'ai ajouté à another question


Je suis tombé sur un problème similaire aujourd'hui et juste commencé à utiliser HttpClient for Android

  1. dépendances Ajouté compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1' pour construire.gradle.
  2. Remplacer new DefaultHttpClient() avec HttpClientBuilder.create().build()

Il y a probablement quelques autres refactors mineures que vous pourriez avoir besoin de faire dans d'autres parties du code, mais cela devrait être assez simple.

+0

je la bibliothèque selon la spécification Android 6.0. useLibrary "org.apache.http.legacy.jar". Ce que je vois, c'est qu'il envoie la requête http. le serveur répond avec le code 401 et nous envoyons à nouveau avec l'authentification Digest. Si vous voyez le journal des erreurs, je ressens un problème avec les paramètres de Digest. En attendant pouvez-vous me dire comment utiliser votre nouveau code. Je ne peux pas comprendre comment changer le DefaultClient. Votre deuxième point n'est pas clair – Sunil

+0

J'utilisais également le pot hérité, mais recevais toujours l'erreur * seulement sur LG G5 et LG G3 *. Je ne vois pas de code exemple, donc je suppose que vous avez un endroit où vous utilisez le 'DefaultHttpClient' de la bibliothèque apache. Si vous ajoutez la nouvelle dépendance, vous devez mettre à jour le code dans lequel vous utilisez 'DefaultHttpClient' pour utiliser le' HttpClientBuilder' avant de faire la demande. Cela utilisera le nouveau code dans 'httpclient-android' et devrait gérer correctement les paramètres de résumé. – jfred

+0

Merci beaucoup pour vos commentaires. Je suis vraiment heureux de voir votre soutien. C'est un problème très important pour moi. Selon votre commentaire, j'ai mis à jour mon code d'application. Maintenant, vous pouvez voir le code ci-dessus.KIndly me soutenir sur la façon de changer ce code selon le HttpClientBuilder. – Sunil

0

Donner quelque chose comme ça, j'ai eu un problème similaire sur MotoX en cours d'exécution 6.0.1 mais cela semble fonctionner pour moi.

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; 
    } 
} 

aussi coller ce dans le gradle sous les dépendances

compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'