2013-11-27 6 views
7

शुभ दिन!java.lang.No.SuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

मुझे मदद चाहिए!

मैं आईआईएस (शेयरपॉइंट) के एकीकरण के साथ एंड्रॉइड के लिए ऐप विकसित करता हूं। और जब मैं इस कोड (कोड 2) चलाने के लिए, मैं मिलता है त्रुटि

java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE

मैं विधि onCreate में firstActivity में इस कोड (कोड 1) चलाने

संस्करण httpclient - 4.3;

कोड 1

new Thread(new Runnable() { 
      @Override 
      public void run() { 
        new HttpsClietn(); 
    } 
}).run(); 

कोड 2

package com.example.HttpsMy; 

import android.os.Environment; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.NTCredentials; 
import org.apache.http.client.CredentialsProvider; 
import org.apache.http.client.HttpClient; 

import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.protocol.HttpClientContext; 
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 
import org.apache.http.impl.client.BasicCredentialsProvider; 
import org.apache.http.impl.client.HttpClientBuilder; 


import javax.net.ssl.KeyManagerFactory; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.security.*; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

public class HttpsClietn { 
    HttpsClietn() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException { 

     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(AuthScope.ANY, new NTCredentials("Grigoriy.Polyakov","password", "", "domain.kz")); 

     HttpClientContext context = HttpClientContext.create(); 
     context.setCredentialsProvider(credsProvider); 

     HttpGet httpget = new HttpGet("https://serveer.domain.kz"); 


     HttpClient client = HttpClientBuilder.create() 
       .setSSLSocketFactory(getFactory()) 
       .setDefaultCredentialsProvider(credsProvider) 
       .setSslcontext(getContext()) 
       .build(); 

     System.out.println(client.execute(httpget,context).getStatusLine()); 

    } 

    SSLContext getContext() throws NoSuchAlgorithmException, KeyStoreException, IOException, KeyManagementException, CertificateException, UnrecoverableKeyException { 
     //new File("key/keystore.p12"), "1234" 
     KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

     InputStream keyInput = new FileInputStream(new File(Environment.getExternalStorageDirectory().getPath()+"/kvv/keystore.p12")); 
     keyStore.load(keyInput, "1234".toCharArray()); 
     keyInput.close(); 

     keyManagerFactory.init(keyStore, "1234".toCharArray()); 

     TrustManager[] trustAllCerts = new TrustManager[]{ 
       new X509TrustManager() { 
        @Override 
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { 
        } 

        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 

        public void checkServerTrusted(X509Certificate[] certs, String authType) { 
        } 
       } 
     }; 

     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new SecureRandom()); 

     return context; 
    } 

    SSLConnectionSocketFactory getFactory() throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException { 
     return new SSLConnectionSocketFactory(getContext()); 
    } 
} 

किसी भी मदद के लिए धन्यवाद।

उत्तर

10

अपाचे एचटीपी क्लाइंट के बेहद पुराने (पूर्व बीटा 4.0) कांटा के साथ Google एंड्रॉइड जहाजों। क्लासपाथ पर पुरानी कक्षाओं की उपस्थिति के कारण एचटीपी क्लाइंट का स्टॉक संस्करण सही ढंग से प्रारंभ करने में विफल रहता है जब तक कि सभी वर्गों को किसी अन्य नेमस्पेस ('org.apache.http' -> 'thank.you.google.http' पर स्थानांतरित नहीं किया जाता है)

यह सुनिश्चित करने का एक तरीका है कि अपाचे एचटीपी क्लाइंट का स्टॉक संस्करण इसके मूल नामस्थान के साथ ओवरलैप नहीं करता है, इसे Maven Shade plugin के साथ दोबारा लोड कर रहा है, the port का उपयोग डिर्क बॉय द्वारा विकसित किया गया है, या official port of Apache HttpClient to Google Android

+0

धन्यवाद अपने build.gradle फ़ाइल में

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

जोड़ने! अगर मैं httpclient – G1yyK

+0

@ G1yyK को पुन: संकलित नहीं करता हूं, तो मैं नेमस्पेस को बदल सकता हूं (इसे दूसरों को डीआईआर में ले जाएं): यह एक अलग सवाल है, जिसका उत्तर पहले से ही एक से अधिक अवसरों पर दिया गया है। वैसे भी, मैंने अपने मूल उत्तर में एक और अनुभाग जोड़ा, जिसमें रिकैकिंग विकल्पों के विवरण हैं। – oleg

+0

मैं एक बहुत ही समान मुद्दे पर आया था। HttpClient को दोबारा बनाने का वास्तव में क्या मतलब है और मैं इसे कैसे कर सकता हूं (मैंने इसे देखने की कोशिश की लेकिन इसे करने के तरीके पर कोई मार्गदर्शिका नहीं है - कम से कम मुझे एक नहीं मिला) –

0

एंड्रॉयड निकालने के लिए सभी httpclient और httpcore निर्भरता और