Estoy intentando cargar/referenciar imágenes desde la carpeta de activos de la aplicación desde una página HTML en una WebView. A diferencia de la mayoría de los ejemplos, la página HTML en sí no se encuentra en la carpeta de activos, sino que se carga desde un servidor a través de http. El trasfondo de esta pregunta son algunas mejoras de rendimiento que deberían reducir el tiempo de carga (y la cantidad de datos transferidos) cargando imágenes estáticas directamente desde el dispositivo. No estoy seguro si Android tiene algunas restricciones aquí porque existe una cierta posibilidad de explotar la aplicación al permitir el acceso al almacenamiento de archivos local desde una página web cargada remotamente.Android: Cómo hacer referencia a imágenes de activos desde una página html cargada remotamente en webview
Primero intenté cargar imágenes usando <img src="file:///android_asset/myimage.png">
pero esto falló (por razones obvias). Mi próximo intento fue usar una clase ContentProvider
e imágenes de referencia usando <img src="content://com.myapp.assetcontentprovider/myimage.png">
. Este ContentProvider se implementa de la siguiente manera:
public class AssetContentProvider extends ContentProvider
{
private static final String URI_PREFIX = "content://com.myapp.assetcontentprovider";
public static String constructUri(String url) {
Uri uri = Uri.parse(url);
return uri.isAbsolute() ? url : URI_PREFIX + url;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
Log.d("AssetContentProvider", uri.getPath());
try {
return getContext().getAssets().openFd(uri.getPath().substring(1)).getParcelFileDescriptor();
} catch (IOException e) {
Log.d("AssetContentProvider", "IOException for " + uri.getPath());
throw new FileNotFoundException();
}
}
// more methods irrelevant for this post
}
Al cargar la página HTML que puedo ver en el registro de depuración que se activa realmente openFile()
de la vista Web y devuelve un objeto válido ParcelFileDescriptor
pero todavía no se muestra la imagen. No hay mensajes de error en el registro que me digan que WebView se negó a cargar/mostrar la imagen. ¿Alguna idea de si esto podría funcionar?
¿Encontró una respuesta a su pregunta inicial (por qué 'file: //' scheme ro 'content: //' no funciona correctamente)? – Olegas