适配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
相关产品推荐
相关产品推荐

