現在のアプリケーションでは、スペインのさまざまな「イベント プロバイダー」から画像を収集しています。
Bitmap bmp=null;
HttpGet httpRequest = new HttpGet(strURL);
long t = System.currentTimeMillis();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
Log.i(TAG, "Image ["+ strURL + "] fetched in [" + (System.currentTimeMillis()-t) + "ms]");
HttpEntity entity = response.getEntity();
InputStream instream = entity.getContent();
bmp = BitmapFactory.decodeStream(instream);
return bmp;
ただし、salir.com から画像をダウンロードすると、次の logcat 出力が得られます。
13970 Gallery_Activity I Fetching image 2/8 URL: http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
13970 skia D --- decoder->decode returned false
そのエラー メッセージを検索しても、あまり有用な結果は得られませんでした。
誰でも問題が何であるか考えていますか?
グラシアス!
更新 1:
もう少し調べて、さまざまなものをテストした後、問題は別の場所にあるように思われることがわかりました。私のlogcat出力は言うが
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
getContentLength(): 93288
これは画像の正しい長さ (バイト単位) です。ストリームまたは HTTP 接続に問題があるようです。
私の元のコード (上記) はThreadSafeClientConnManagerを利用しています。それを単純なものに置き換えると、URLConnection
完全に機能します:
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);
それで、なぜ私のThreadSafeClientConnManager
仕事は他のすべての接続(主に交換)では完璧に(少なくともそう見える)、JSONObjects
特定のウェブサイトからの画像ではそうではないのか疑問に思っています(例:salir.com - 他のほとんどのウェブサイトでは動作しますけれど)。不足している HTTP パラメーターはありますか?
私の現在の設定は次のとおりです。
HttpParams parameters = new BasicHttpParams();
HttpProtocolParams.setVersion(parameters, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(parameters, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(parameters, false); // some webservers have problems if this is set to true
ConnManagerParams.setMaxTotalConnections(parameters, MAX_TOTAL_CONNECTIONS);
HttpConnectionParams.setConnectionTimeout(parameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(parameters, SOCKET_TIMEOUT);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), HTTP_PORT));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
DefaultHttpClient http_client = new DefaultHttpClient(conMgr, parameters);
更新 2:
さて、奇妙なことに、実際にはThreadSafeClientConnManager
-sometimes-で動作します。画像のダウンロードとデコードを数回連続して試行し続けると、15 ~ 30 回の試行後に機能する可能性があります。非常に奇妙な。
ThreadSafeClientConnManager
の代わりに を使用したいので、解決策があることを願っていURLConnection
ます。
更新 3:
以下のMike Mosherが示唆しているように、BufferedHttpEntityを使用することで、デコードエラーは表示されなくなりました。ただし、以前よりも頻度は低くなりましたが、SkImageDecoder::Factory returned null
エラーが発生します。