私はHTTPSリクエストにHttpClientを使用しています。 ICSにアップグレードした後、一部のユーザーが3G接続で接続する際の問題を報告しています。Android:Scheme 'http'はICS 4.0.4に登録されていません。
編集:ほとんどはプロキシを使用しているようですが、プロキシを使用してローカルでT-Mobile SIMを再現できます。
ログは、このスタックトレースを持っている:
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エンドポイントを登録しません。 HTTPにリダイレクトする場所(AFAIK)はありません。ここで
は、HTTPSクライアントのためのHttpClientをセットアップするコードは次のとおりです。
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;
注:私たちは、複数のスレッド間でこのHttpClientをインスタンスを共有します。
BYPASS_PROXYとは何ですか?なぜ私たちはいつもこのルートプランナーを使用できませんか?このソリューションは安全です(例:httpsを使用していますか? –
あなたはコードがそのトリックです。それはただ突然3G(Telenor、スウェーデン)上で私のために起こり始めた。これを常時オンにすることで潜在的な問題はありますか? – apanloco
常にオンにするのに問題がありますか? –