Android. Загрузка изображения в WebView из stream'а или массива байт?

Задача такая. Есть кастомный WebView, в него загружается хтмл-контент из бинарного файла внутреннего формата. Там также могут присутствовать и изображения. По условиям ТЗ, нельзя использовать временные файлы.


Задачу решил кодированием бинарного контента изображения в base64 и помещением непосредственно в тег img. Работает, но на больших изображениях показывает весьма низкую производительность (оверхед на кодирование в base64 и значительно увеличившееся время на декодинг и рендеринг у WebView). Вижу обходной путь в переопределении метода загрузки изображения и заменить его своей реализацией, подсовывая готовый бинарный контент, однако поиск по гуглу и developer.android.com ничего не дал.


Есть идеи?
  • Вопрос задан
  • 3052 просмотра
Пригласить эксперта
Ответы на вопрос 3
Можно использовать загрузку изображений через контент-провайдер. Ссылка из страницы получается content://com.path.to.package/file.ext

В манифесте <provider android:name=".ImageProvider" android:authorities="com.path.to.package" />

В классе провайдера определяете функцию

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
	File file = new File(....); 
	ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
	return parcel;
} 


Как-то так.
Ответ написан
falstaf
@falstaf Автор вопроса
Как выяснилось, getFileDescriptor() возвращает null. С чем это может быть связано? В документации ничего не нашел по этому поводу.
Ответ написан
falstaf
@falstaf Автор вопроса
Прописал в манифесте контент-провайдер, openFile вызывается, все как положено.
В самом openFile делаю примерно следующее:
byte[] imageData = ...;
Parcel parcel = Parcel.obtain();
parcel.writeByteArray(imageData, 0, imageData.length);
return parcel.getFileDescriptor();

Метод успешно отрабатывает, но WebView на месте изображения показывает стандартный значок вопроса, дескать, изображение не доступно.
Что я делаю не так? :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы