2012-01-25 10 views
2

URLから画像をダウンロードしてImageViewとして表示しようとしています。ダウンロードは、AsyncTaskを使用してバックグラウンドで行われます。しかし、BitmapFactoryのdecodeStreamを呼び出すと、常にnullオブジェクトが返されます。接続に提供されたURLが正しいことを確認しましたが、BitmapFactoryがHTTP接続から返されたInputStreamからイメージを読み取れないようです。ここでは以下のコードは次のとおりです。BitmapFactory.decodeStream()を使用してURLから画像を読み込むことができません。

@Override 
    protected Bitmap doInBackground(String... uri) { 
     Bitmap bm = null; 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(Uri.encode(uri[0])); 
     try { 
      HttpResponse response = client.execute(request); 
      HttpEntity entity = response.getEntity(); 
      String contentType = entity.getContentType().getValue(); 
      DisplayMetrics metrics = new DisplayMetrics(); 
      getWindowManager().getDefaultDisplay().getMetrics(metrics); 
      int halfScreen = metrics.widthPixels/2; 
      int photoWidth = halfScreen > 200 ? 200 : halfScreen; 
      if (contentType.contains("image/jpeg") || contentType.contains("image/png") || contentType.contains("image/gif")) { 
       bm = BitmapFactory.decodeStream(new BufferedInputStream(entity.getContent())); 
       if (bm.getWidth() > photoWidth) 
       bm = Bitmap.createScaledBitmap(bm, photoWidth, Math.round((photoWidth*bm.getHeight())/bm.getWidth()), true); 
      } 
     } catch (Exception e) { 
      bm = null; 
     } 
     return bm; 
    } 

奇妙である何ことはまったく同じコードがネクサスS上で細かい動作しますが、アンドロイド2.1アップデート1を実行しているサムスンでは動作しないということです。

+0

は、あなたが潜在的なメモリエラーのlogcatを確認しました? –

+0

メモリエラーはありませんでした。私は自分の質問に答えを出しました。ありがとう。 – sbruno74

答えて

2

問題はBitmapFactory.decodeStream()メソッドにありました。この方法には遅い接続で失敗するバグがあるようです。 http://code.google.com/p/android/issues/detail?id=6066にある推奨事項を適用しました。

は、私は以下のFlushedInputStreamクラスを作成しました:

public class FlushedInputStream extends FilterInputStream { 

protected FlushedInputStream(InputStream in) { 
    super(in); 
} 

@Override 
public long skip(long n) throws IOException { 
    long totalBytesSkipped = 0L; 
    while (totalBytesSkipped < n) { 
     long bytesSkipped = in.skip(n - totalBytesSkipped); 
     if (bytesSkipped == 0L) { 
       int onebyte = read(); 
       if (onebyte < 0) { 
        break; // we reached EOF 
       } else { 
        bytesSkipped = 1; // we read one byte 
       } 
     } 
     totalBytesSkipped += bytesSkipped; 
    } 
    return totalBytesSkipped; 
} 
} 

その後、私のコードで私が使用:

bm = BitmapFactory.decodeStream(new FlushedInputStream(entity.getContent())); 

の代わり:

bm = BitmapFactory.decodeStream(new BufferedInputStream(entity.getContent())); 
0

この質問で行われたように、HttpEntityをBufferedHttpEntityにラップしてみてください:BitmapFactory.decodeStream returns null without exception問題はかなり似ているようだ。

+0

ありがとう!私はこれを試しました、そして、それは部分的に働いているようでした。私は確かに働いた答えを見つけ出し、この質問の答えとして投稿します。 – sbruno74

関連する問題