有一种方法可以“强制”从本地资产(例如,assets/js/script.js)中注入本地Javascript文件,并规避“不允许加载本地资源”:file:/// android_assets / js/script.js …’问题。
webview-loading-javascript-file-in-assets-folder))中描述的内容,并带有其他base64编码/解码,用于将Javascript文件表示为可打印的字符串。
我正在使用Android 4.4.2,API级别19虚拟设备。
以下是一些代码片段:
[assets / js / script.js]:
'use strict'; function test() { // ... do something } // more Javascript[MainActivity.java]:
... WebView myWebView = (WebView) findViewById(R.id.webView); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavascriptEnabled(true); webSettings.setAllowUniversalAccessFromFileURLs(true); myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); injectscriptFile(view, "js/script.js"); // see below ... // test if the script was loaded view.loadUrl("javascript:setTimeout(test(), 500)"); } private void injectscriptFile(WebView view, String scriptFile) { InputStream input; try { input = getAssets().open(scriptFile); byte[] buffer = new byte[input.available()]; input.read(buffer); input.close(); // String-ify the script byte-array using base64 encoding !!! String enpred = base64.enpreToString(buffer, base64.NO_WRAP); view.loadUrl("javascript:(function() {" + "var parent = document.getElementsByTagName('head').item(0);" + "var script = document.createElement('script');" + "script.type = 'text/javascript';" + // Tell the browser to base64-depre the string into your script !!! "script.innerHTML = window.atob('" + enpred + "');" + "parent.appendChild(script)" + "})()"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); myWebView.loadUrl("http://www.example.com"); ...


