Android: Schema 'http' non registrato su ICS 4.0.4 w / proxy

Sto utilizzando HttpClient per le richieste HTTPS, che ha funzionato fino ad ora. Dopo l'aggiornamento a ICS, alcuni utenti stanno segnalando i problemi relativi alla connessione con le connessioni 3G.

EDIT: la maggior parte di loro sembra utilizzare un proxy e posso riprodurlo localmente con una T-Mobile SIM usando il loro proxy.

  • Vuoi compilare un binario Android nativo che posso eseguire in terminal sul telefono
  • Invito della stanza XMPP
  • Come mettere l'authentication utente in un'applicazione mobile
  • BroadcastReceiver all'interno di un servizio che non riceve trasmissioni Android
  • Come installare Android SDK su Linux utilizzando solo CLI?
  • L'aggiornamento di Android sostituisce ancora alcuni frammenti sostituiti
  • I log hanno questa traccia di stack:

    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) 

    Il nostro endpoint è solo HTTPS, pertanto non registriamo un endpoint HTTP nel nostro SchemeRegistry. Non esiste nessuna sede (AFAIK) where reindirizziamo su HTTP.

    Ecco il codice che installa HttpClient per il client HTTPS:

      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; 

    Nota: condividiamo l'istanza di HttpClient tra più thread.

  • Come posso utilizzare adb per submit un evento a chiave longpress?
  • Come gestire le differenze di database di JodaTime e Android?
  • Ordina ArrayList con i tempi in Java
  • l'android di importzione non è stato risolto
  • Come fermare il servizio da solo?
  • Impedire il recupero di frammento in Android
  • 3 Solutions collect form web for “Android: Schema 'http' non registrato su ICS 4.0.4 w / proxy”

    Dalla tua stacktrace, suggerirei di registrare entrambi (http, https) e vedere se ciò non funziona.

    Dovresti essere in grado di eseguire il debug con l'inclusione dei vasi di origine apache – eseguire il drill down sulla traccia @ SchemeRegistry.getScheme ().

    Questo thread può aiutare.

    Sotto è testato OK su ICS … Esempio di SSL ConnectionMgr su libs androidhttpclient :

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

    Il problema sembrava che alcuni vettori stessero spingendo definizioni proxy non valide con l'aggiornamento di 4.0.4. Questo ha interrotto HTTPS ma HTTP ha funzionato correttamente (ad esempio, Google Play non ha funzionato).

    Una ansible correzione (oltre a fissare la voce del proxy non valida) è quella di catturare IllegalStateException durante l'esecuzione di richieste HttpClient e impostare una bandiera. Questo codice ignorerà qualsiasi proxy:

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

    Non creerei un nuovo SchemeRegistry. Vorrei prendere il predefinito da ThreadSafeClientConnManager.getSchemeRegistry (). In questo modo, probabilmente contiene tutti i tipi di schemi già supportti.

    La parte http può provenire dal proxy del tuo operatore.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.