Декодер Skia не декодирует удаленный поток
Я пытаюсь открыть удаленный поток изображения JPEG и преобразовать его в растровый объект:
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
декодер возвращает null и в журналах я получаю следующее сообщение:
DEBUG/skia(xxxx): --- decoder->decode returned false
Примечание:
1. длина контента не равна нулю, а тип контента -image/jpeg
2. Когда я открываю URL в браузере, я вижу изображение.
чего мне здесь не хватает?
пожалуйста, помогите. Спасибо.
4 ответов
решение предусмотрено в android ошибка n°6066 состоят в переопределении std FilterInputStream, а затем отправить его в BitmapFactory.
static class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int byteValue = read();
if (byteValue < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
а затем используйте функцию decodeStream:
Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
другое решение, которое я нашел, - просто дать BufferedInputStream Th BitmapFactory:
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
эти два решения должны делать трюк.
более подробную информацию можно найти в комментариях к баг-репорту : android ошибка нет.6066
кажется, была какая-то проблема с потоком и тем, как android обрабатывал его; патч в этом сообщить об ошибке решил проблему на данный момент.
Я нашел библиотеку, которая может открывать изображения, на которых Android SKIA терпит неудачу. Это может быть полезно для определенных навигации:
https://github.com/suckgamony/RapidDecoder
для меня это решило проблему, так как я не загружаю много изображений сразу, и много изображений, которые я загружаю, имеют профиль ICC. Я не пытался интегрировать его с некоторыми общими библиотеками, такими как Picasso или Glide.