- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试从 WebView 的 HTML 页面中加载/引用应用程序 Assets 文件夹中的图像。与大多数示例不同,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 拒绝加载/显示图像。任何想法是否可行以及如何实现?
最佳答案
好的,多亏了 mufumbo 的回答,我现在找到了一个有效的 hack,可以在远程加载的 HTML 页面中混合本地资源。使用 WebView 的 loadUrl()
方法加载的页面不会加载与 file:///android_asset/... 链接的图像 作为解决方法,您可以使用 org.apache.http 获取 HTML 页面.client.methods.HttpGet.HttpGet()
,然后使用 loadDataWithBaseURL()
将其传递给 WebView。在这种情况下,WebView 将通过 HTTP 加载与 file:///android_asset/链接的资源以及图像和脚本。这是我自定义的 webview 代码:
public class CustomWebView extends WebView {
private String mURL;
public void loadUrlWithAssets(final String url) {
// copy url to member to allow inner classes accessing it
mURL = url;
new Thread(new Runnable() {
public void run() {
String html;
try {
html = NetUtil.httpGETResponse(mURL);
// replace some file paths in html with file:///android_asset/...
loadDataWithBaseURL(mURL, html, "text/html", "UTF-8", "");
}
catch (IOException e) {
Log.e("CustomWebView.loadUrlWithAssets", "IOException", e);
}
}
}).start();
}
}
请注意,整个 http 抓取都包含在自制的实用程序类 NetUtil
中。
有了这个类,可以从网络服务器呈现 HTML 页面,并从应用程序的 Assets 文件夹中加载一些静态资源,例如图像或样式表,以提高加载速度并节省带宽。
关于Android:如何在 webview 中从远程加载的 html 页面引用 Assets 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854966/
我是一名优秀的程序员,十分优秀!