You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配Android13后Android10+版本WebView图片加载失败问题

Android10+ WebView加载assets本地图片失败排查方案

问题场景

  • 遗留邮件应用适配Android13后,Android10及以上版本WebView无法加载assets目录中的.png图片,Android10以下版本运行正常
  • 内容加载方式:
    webView.loadDataWithBaseURL("file:///android_asset/", html, mMime, mEncoding, null);
    
  • 已配置以下WebSettings但未解决问题:
    webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setCacheMode(WebSettings.LOAD_NORMAL);
    webView.getSettings().setLoadsImagesAutomatically(true);
    webView.getSettings().setAllowFileAccessFromFileURLs(true);
    webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
    

排查与解决方案

1. 校验HTML中图片路径格式

确保HTML内图片使用相对路径,例如src="icon.png",而非带斜杠前缀的路径(如src="/icon.png")。因为loadDataWithBaseURL已指定file:///android_asset/作为基准路径,带斜杠的路径会被解析为系统根路径,导致无法定位到assets内的文件。

2. 替换BaseURL为兼容高版本的URI格式

将loadDataWithBaseURL的基准URL替换为Android资源URI格式,部分高版本系统对该格式的兼容性更好:

String baseUrl = "android.resource://" + getPackageName() + "/asset/";
webView.loadDataWithBaseURL(baseUrl, html, mMime, mEncoding, null);

3. 手动拦截图片加载请求

重写WebViewClient的shouldInterceptRequest方法,手动从assets读取图片流并返回给WebView,绕过高版本的访问限制:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        // 匹配assets中的png图片请求
        if (url.contains("android_asset") && url.endsWith(".png")) {
            String assetPath = url.substring(url.lastIndexOf("/") + 1);
            try {
                InputStream inputStream = getAssets().open(assetPath);
                return new WebResourceResponse("image/png", "UTF-8", inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return super.shouldInterceptRequest(view, request);
    }
});

4. 防止assets图片被构建工具压缩

在模块的build.gradle中添加配置,避免aapt工具压缩assets中的png文件,防止WebView无法解析:

android {
    aaptOptions {
        noCompress 'png'
    }
}

5. 检查HTML内容处理逻辑

核对HTML内容处理流程,确保没有在处理过程中篡改图片路径(如多余的转义字符、路径拼接错误等),避免因路径变形导致WebView无法定位资源。

内容的提问来源于stack exchange,提问作者Gaurav Karia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:55:31