Android:如何从webview中远程加载的html页面引用资源图像

我正在从WebView中的 HTML页面中加载/引用应用的资产文件夹中的图像.与大多数示例不同,HTML页面本身不在资产文件夹中,而是通过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的回答,我现在发现了一个工作的黑客,将本地资产混合在远程加载的HTML页面中.使用WebView的loadUrl()方法加载的页面不加载与file:/// android_asset / …链接的图像作为解决方法,您可以使用org.apache.http.client.methods.HttpGet.HttpGet()获取HTML页面,然后使用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中.

使用这个类,可以从Web服务器呈现HTML页面,并且从应用的资源文件夹中加载一些静态资源,如图像或样式表,以提高加载速度并节省带宽.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...