Android: Le schéma 'http' n'est pas enregistré sur ICS 4.0.4 w / proxy
Je suis en utilisant HttpClient pour les requêtes HTTPS, qui a bien fonctionné jusqu'à maintenant. Après la mise à jour ICS, certains utilisateurs signalent des problèmes de connexion en 3G connexions.
EDIT: la Plupart d'entre eux semblent être l'aide d'un proxy, et je peux reproduire ce local avec un T-Mobile SIM à l'aide de leur procuration.
Les journaux ont cette trace de la pile:
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)
Notre point de terminaison est HTTPS uniquement, afin de ne pas enregistrer un point de terminaison HTTP dans notre SchemeRegistry sur le but. Il n'y a pas n'importe où (à ma connaissance) où nous avons redirection HTTP.
Voici le code qui met en place le HttpClient pour le 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;
Remarque: Nous partageons cette HttpClient exemple entre plusieurs threads.
source d'informationauteur sehugg
Vous devez vous connecter pour publier un commentaire.
De votre stacktrace, je vous conseille de vous inscrire à la fois ( http, https ) et de voir si cela ne fonctionne pas.
Vous devriez être en mesure de le déboguer en incluant les sources d'apache pots - de forage vers le bas sur la trace @SchemeRegistry.getScheme().
Cette thread peut aider.
Ci-dessous est testé OK sur ICS...
Exemple de SSL ConnectionMgr sur androidhttpclient libs:
La question semble être que certains transporteurs ont poussé les proxy non valide définitions avec la mise à jour 4.0.4. C'est en HTTPS mais HTTP fonctionné correctement (Google Play ne fonctionne pas, par exemple).
Une solution possible (en plus de la fixation du proxy non valide entrée) est d'attraper l'exception IllegalStateException lors de l'exécution de HttpClient demandes et de définir un indicateur. Ce code permet de contourner un proxy:
Je ne voudrais pas créer un nouveau SchemeRegistry. Je prendrais celui par défaut de la ThreadSafeClientConnManager.getSchemeRegistry(). De cette façon, il contient probablement de toute sorte de déjà protocoles pris en charge.
Http part peut venir de votre fournisseur de proxy.