Не удается загрузить изображение из URL-адреса с помощью BitmapFactory.decodeStream () - PullRequest
2 голосов
/ 26 января 2012

Я пытаюсь загрузить изображение с URL-адреса для отображения в виде ImageView.Загрузка осуществляется в фоновом режиме с использованием AsyncTask.Однако вызов decodeStream объекта BitmapFactory всегда возвращает нулевой объект.Я проверил, что URL-адрес, предоставленный для соединения, правильный, но кажется, что BitmapFactory не может прочитать изображение из InputStream, возвращенного HTTP-соединением.Вот код ниже:

@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, но не работает на Samsung с Android 2.1-update1.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Проблема была в методе 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 голосов
/ 26 января 2012

Попробуйте обернуть ваш HttpEntity в BufferedHttpEntity, как это сделано в этом вопросе: BitmapFactory.decodeStream возвращает ноль без исключения . Кажется, что проблема очень похожа.

...