Проблема Android 6.0 HTTPClient с телефоном LG G3
Привет я использую класс DefaultHTTPClient для создания http-запроса.
Метод currrent code 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 client и теперь используют класс HTTPUrlConnection
I попытался скопировать "орг.апаш.http.наследие.jar " файл из sdk в папку my project lib.
Но все равно я сталкиваюсь с тем же журналом ошибок. Я надеюсь, что кто-то может помочь мне разобраться с этим вопросом.
Пожалуйста, найдите код приложения, как он есть:
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
2 ответа:
Столкнулся с чем-то подобным и получил исправление, которое я пытаюсь добавить к другому вопросу
Я столкнулся с подобной проблемой сегодня и только начал использовать HttpClient для Android
- добавлена зависимость
compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
для построения.градля.- заменить
new DefaultHttpClient()
наHttpClientBuilder.create().build()
Вероятно, есть и другие незначительные рефакторы, которые вам, возможно, потребуется сделать в других частях кода, но это должно быть довольно прямолинейно.
Дайте что-то вроде этого, у меня была подобная проблема на 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; } }
Также вставьте это в gradle под зависимостями
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'