項目需要在遠程網(wǎng)頁里面調用app中assets目錄下的某個js文件,
開始這樣寫的
<script src="file:///android_asset/test.js"></script>
結果運行提示:
[INFO:CONSOLE(25) ]Not allowed to load local resource: file:///android_asset/xxx
在百度搜了半天沒人解決,無奈去stackoverflow
才找到有效的回答(親測有效):
//A bit of an intrusive hack, but I worked around this issue by introducing a
//"unique token" and implementing the WebViewClient with a
//shouldInterceptRequest override.
//First, change the URL from file:///android/asset to a relative path with a
//uniquely identifying token:
<script src="**injection**www/scripts.js"></script>
Then, override shouldInterceptRequest as follows:
// 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;
}
});
This is likely to degrade WebView performance slightly as we are calling the contains() on each resource which is attempted to be loaded, but it's the only workaround I've found to this issue.