Android Web-View : 将本地 Javascript 文件注入远程网页 [英] Android Web-View : Inject local Javascript file to Remote Webpage
问题描述
之前被问过很多次,我浏览了所有内容,还没有明确的答案.
It has been asked many times before, I browsed through everything, no clear answers yet.
问题简化:是否可以将本地 Javascript 文件(从资产或存储)注入到加载在 Android Web 视图中的远程网页?我知道可以将此类文件注入 Web 视图中加载的本地网页(资产 HTML).
Question simplified: Is it possible to inject local Javascript file (from asset or storage) to remote webpage loaded in an Android Web-View? I know that it is possible to inject such files to local Webpages (Assets HTML) loaded in a Web-View.
为什么我需要它来工作?:为了让浏览体验更快,避免每次下载较大的文件,如 Js 和 CSS 文件.我想避免 Web 视图缓存.
Why do I need this to work? : To make browsing experience faster, by avoiding downloading of bigger files such as Js and CSS files every time. I want to avoid Web-View Caching.
推荐答案
有一种方法可以强制"从本地资产(例如,assets/js/script.js)注入本地 Javascript 文件,并规避不允许加载本地资源:file:///android_assets/js/script.js ..."问题.
There is a way to 'force' the injection of your local Javascript files from local assets (e.g., assets/js/script.js), and to circumvent the 'Not allowed to load local resource : file:///android_assets/js/script.js ...' issue.
它类似于另一个线程中描述的内容(Android webview,在 assets 文件夹中加载 javascript 文件),附加的 BASE64 编码/解码用于将您的 Javascript 文件表示为可打印的字符串.
It is similar to what described in another thread (Android webview, loading javascript file in assets folder), with additional BASE64 encoding/decoding for representing your Javascript file as a printable string.
我使用的是 Android 4.4.2,API 级别 19 虚拟设备.
I am using an Android 4.4.2, API level 19 Virtual Device.
以下是一些代码片段:
[assets/js/script.js]:
[assets/js/script.js]:
'use strict';
function test() {
// ... do something
}
// more Javascript
[MainActivity.java]:
[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 encoded = Base64.encodeToString(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-decode the string into your script !!!
"script.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(script)" +
"})()");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
myWebView.loadUrl("http://www.example.com");
...
这篇关于Android Web-View : 将本地 Javascript 文件注入远程网页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!