2012-04-27 15 views
12

पर पंजीकृत नहीं है, मैं एचटीटीपीएस अनुरोधों के लिए एचटीपी क्लाइंट का उपयोग कर रहा हूं, जिसने अभी तक ठीक काम किया है। आईसीएस में अपग्रेड करने के बाद, कुछ उपयोगकर्ता 3 जी कनेक्शन से कनेक्ट होने वाली समस्याओं की रिपोर्ट कर रहे हैं।एंड्रॉइड: योजना 'http' आईसीएस 4.0.4 डब्ल्यू/प्रॉक्सी

संपादित करें: उनमें से अधिकतर प्रॉक्सी का उपयोग कर रहे हैं, और मैं इसे स्थानीय रूप से अपने प्रॉक्सी का उपयोग कर टी-मोबाइल सिम के साथ पुन: उत्पन्न कर सकता हूं।

लॉग यह स्टैक ट्रेस है:

java.lang.IllegalStateException: Scheme 'http' not registered. 
org.apache.http.conn.scheme.SchemeRegistry.getScheme(SchemeRegistry.java:80) 
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:126) 
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 

हमारे अंत बिंदु को केवल HTTPS का है, इसलिए हम उद्देश्य पर हमारे SchemeRegistry में एक HTTP endpoint रजिस्टर नहीं है। कहीं भी नहीं है (AFAIK) जहां हम HTTP पर रीडायरेक्ट करते हैं।

DefaultHttpClient ret = null; 

    // sets up parameters 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "utf-8"); 
    params.setBooleanParameter("http.protocol.expect-continue", false); 

    HttpConnectionParams.setConnectionTimeout(params, DEFAULT_CONN_TIMEOUT_MSEC); 
    HttpConnectionParams.setSoTimeout(params, timeoutMsec); 
    HttpConnectionParams.setStaleCheckingEnabled(params, true); 

    SchemeRegistry registry = new SchemeRegistry(); 
    final SocketFactory sslSocketFactory = getPreferredSSLSocketFactory(); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 

    ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); 
    ret = new DefaultHttpClient(manager, params); 
    // for preemptive authentication 
    // http://dlinsin.blogspot.com/2009/08/http-basic-authentication-with-android.html 
    ret.addRequestInterceptor(preemptiveAuth, 0); 
    ret.setCookieStore(communalCookieJar); 

    SimpleCredentialsProvider credProvider = new SimpleCredentialsProvider(getAccountPreferences()); 
    ret.setCredentialsProvider(credProvider); 

    return ret; 

नोट::

यहाँ कोड है कि HTTPS ग्राहक के लिए HttpClient सेट करता है हम एक से अधिक थ्रेड के बीच इस HttpClient उदाहरण साझा करें।

उत्तर

3

मुद्दा है कि कुछ वाहक 4.0.4 अद्यतन के साथ अमान्य प्रॉक्सी परिभाषाओं धक्का कर रहे थे लग रहा था। इसने एचटीटीपीएस तोड़ दिया लेकिन HTTP ने ठीक से काम किया (उदाहरण के लिए Google Play काम नहीं करता था)।

एक संभावित फिक्स (अमान्य प्रॉक्सी प्रविष्टि को ठीक करने के अलावा) HttpClient अनुरोधों को निष्पादित करते समय ध्वज सेट करने और ध्वज सेट करने के लिए IllegalStateException को पकड़ना है। यह कोड किसी भी प्रॉक्सी को बाईपास करेगा:

hc = new DefaultHttpClient(manager, params); 
    if (BYPASS_PROXY) 
     hc.setRoutePlanner(new DefaultHttpRoutePlanner(registry)); 
+7

BYPASS_PROXY क्या है? हम हमेशा इस मार्ग योजनाकार का उपयोग क्यों नहीं कर सकते? क्या यह समाधान सुरक्षित है (उदा। क्या यह अभी भी https का उपयोग करेगा)? –

+0

आप कोड चाल है। यह सिर्फ 3 जी (टेलरॉर, स्वीडन) पर मेरे लिए अचानक शुरू हुआ। क्या यह हमेशा होने के साथ कोई संभावित समस्या है ?? – apanloco

+0

तो क्या हमेशा इसे रखने में कोई समस्या है? –

1

मैं एक नई योजना रजिस्ट्री नहीं तैयार करूंगा। मैं डिफ़ॉल्ट को ThreadSafeClientConnManager.getSchemeRegistry() से ले जाऊंगा। इस तरह, इसमें शायद पहले से ही समर्थित सभी योजनाएं शामिल हैं।

http भाग आपके वाहक की प्रॉक्सी से आ सकता है।

+0

क्या आप विवरण साझा कर सकते हैं? मुझे थ्रेड सुरक्षित या सिंगल क्लाइंट कनेक्शन मैनेजर से डिफ़ॉल्ट स्कीम रजिस्ट्री प्राप्त करने का कोई तरीका नहीं मिला। – apanloco

+0

आपका क्या मतलब है? 'manager.getSchemeRegistry()' प्राप्त नहीं करता है? – njzk2

+0

ThreadSafeClientConnManager और SingleClientConnManager को एक योजना की आवश्यकता है कन्स्ट्रक्टर में रजिस्ट्री, ताकि आप इसे वापस ले सकें जो आपको इसे पहले स्थान पर देना है। – apanloco

6

अपने स्टैकट्रैक से, मैं सुझाव दूंगा कि आप दोनों (http, https) पंजीकृत करें और देखें कि यह काम नहीं करता है या नहीं।

आपको अपाचे स्रोत जार समेत इसे डीबग करने में सक्षम होना चाहिए - ट्रेस @ schemeRegistry.getScheme() पर ड्रिल करें।

This धागा मदद कर सकता है।

नीचे androidhttpclient libs पर आईसीएस पर ठीक परीक्षण किया जाता है ... नमूना एसएसएल ConnectionMgr:

static X509TrustManager tm = new X509TrustManager() { 

     public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
     } 

     public X509Certificate[] getAcceptedIssuers() { 
     return null; 
     } 
}; 

MyConnectionManager(SchemeRegistry scheme){ 
    super(scheme); 
} 

public static MyConnectionManager getInstance() { 
    if (instance == null){ 

     SSLContext ctx=null; 
     try { 
      ctx = SSLContext.getInstance("TLS"); 
      ctx.init(null, new TrustManager[]{tm}, null); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }     
     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(new Scheme("http", 80,PlainSocketFactory.getSocketFactory())); 
     schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); 
     instance = new MyConnectionManager(schemeRegistry); 
     // Increase max total connection to 200 
     instance.setMaxTotal(15); 
     // Increase default max connection per route to 20 
     instance.setDefaultMaxPerRoute(15); 
     // Increase max connections for localhost:80 to 50 
     HttpHost localhost = new HttpHost("picasaweb.google.com", 443); 
     instance.setMaxForRoute(new HttpRoute(localhost), 10); 
    } 
    return instance; 
} 
संबंधित मुद्दे