dum*_*azy 22 android android-webview
我有一个使用WebViews的应用程序.我已经将目标API从18改为19,我正在测试新的4.4.出于某种原因,我收到了这个错误:Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png4.4但不是4.3,有人知道为什么?
由于我真的不知道从哪里开始看,我无法提供完整的代码.它可能与shouldInterceptRequest(Webview, String)WebViewClient中的方法有关,但我不太确定.如果我知道更多,我会更新问题.
Cod*_*gue 22
有点干扰,但我通过引入"唯一令牌"并WebViewClient使用shouldInterceptRequest覆盖来实现这个问题.
首先,将URL更改为file:///android/asset具有唯一标识标记的相对路径:
<script src="**injection**www/scripts.js"></script>
Run Code Online (Sandbox Code Playgroud)
然后,覆盖shouldInterceptRequest如下:
// Injection token as specified in HTML source
private static final String INJECTION_TOKEN = "**injection**";
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = super.shouldInterceptRequest(view, url);
if(url != null && url.contains(INJECTION_TOKEN)) {
String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length());
try {
response = new WebResourceResponse(
"application/javascript",
"UTF8",
getContext().getAssets().open(assetPath)
);
} catch (IOException e) {
e.printStackTrace(); // Failed to load asset file
}
}
return response;
}
});
Run Code Online (Sandbox Code Playgroud)
这可能会稍微降低WebView性能,因为我们正在调用contains()尝试加载的每个资源,但这是我发现此问题的唯一解决方法.
mik*_*guy 19
我发现当我使用时,我在KitKat上遇到了这个问题webview.loadData().如果我改为使用webview.loadDataWithBaseURL()(我使用"file:/// android_asset /"作为baseURL),那么问题就消失了.
这些方法setAllowFileAccess(),setAllowFileAccessFromFileURLs()并setAllowUniversalAccessFromFileURLs()没有任何影响,我可以看到.
"不允许加载本地资源"是安全起源错误.KitKat WebView具有更强的安全限制,看起来似乎正在进行.FWIW我尝试只加载一个文件:/// android_asset URL并且它工作正常.
您是否有机会调用任何与文件相关的WebSettings API(如setAllowFileAccess(false))?您是否尝试从https:URL加载资源?
这是解决方案:当您尝试从库项目加载文件时,会发生此问题.如果您的应用程序依赖于webview和html文件所在的库,那么您需要在编译时将该库项目中的资源包含到主应用程序项目中.例如,IntelliJ有一个选项来执行此操作.在编译器设置"将资源从依赖项包含到APK"中,但请确保您的资产文件应具有与主应用程序不同的名称.您不希望主应用程序覆盖库项目的index.html.
| 归档时间: |
|
| 查看次数: |
43167 次 |
| 最近记录: |