我正在尝试从 WebView 的 HTML 页面中加载/引用应用程序资产文件夹中的图像。与大多数示例不同,HTML 页面本身并不位于 assets 文件夹中,而是通过 http 从服务器加载。这个问题的背景是一些性能改进,它们应该通过直接从设备加载静态图像来减少加载时间(和传输的数据量)。我不确定 Android 是否在这里有一些限制,因为通过允许从远程加载的网页访问本地文件存储来利用该应用程序有一定的可能性。
我首先尝试使用加载图像,<img src="file:///android_asset/myimage.png">
但失败了(原因很明显)。我的下一个尝试是使用一个ContentProvider
类并使用<img src="content://com.myapp.assetcontentprovider/myimage.png">
. 这个 ContentProvider 的实现如下:
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
}
加载 HTML 页面时,我可以在调试日志中看到openFile()
实际上是从 WebView 触发的,它返回一个有效的ParcelFileDescriptor
对象,但仍然没有显示图像。日志中没有显示错误消息,它会告诉我 WebView 拒绝加载/显示图像。任何想法如果以及如何工作?