2

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

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

奇妙なことに、Nexus S ではまったく同じコードが正常に動作しますが、Android 2.1-update1 を実行している Samsung では動作しません。

4

2 に答える 2

3

問題は 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()));
于 2012-01-27T03:08:44.637 に答える
0

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

于 2012-01-26T03:06:34.683 に答える