It has been asked many times before, I browsed through everything, no clear answers yet.

之前已经多次询问过,我浏览过所有内容,还没有明确的答案。

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.

问题简化:是否可以将本地Javascript文件(从资产或存储)注入到Android Web视图中加载的远程网页?我知道可以将这些文件注入Web-View中加载的本地Web页面(Assets HTML)。

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.

为什么我需要这个呢? :通过避免每次都下载较大的文件(如Js和CSS文件)来提高浏览体验。我想避免Web-View缓存。

4 个解决方案

#1


46

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.

有一种方法可以“强制”从本地资产(例如,assets / js / script.js)注入本地Javascript文件,并绕过'不允许加载本地资源:file:/// android_assets / js /script.js ...'问题。

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 webview,在assets文件夹中加载javascript文件)中描述的内容,以及用于将Javascript文件表示为可打印字符串的附加BASE64编码/解码。

I am using an Android 4.4.2, API level 19 Virtual Device.

我使用的是Android 4.4.2,API级别19虚拟设备。

Here are some code snippets:

以下是一些代码段:

[assets/js/script.js]:

[资产/ 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");

    ...

更多相关文章

  1. Gradle for Android 系列:初识 Gradle 文件
  2. SmartRefreshLayout集成笔记,实现下拉刷新上拉加载更多。
  3. Android SQLite的数据库文件存储在SD卡中(一)
  4. Android中如何有效的加载图片
  5. 无法使用@ContextConfiguration加载ApplicationContext(classes =
  6. 反编译APK 得到JAVA代码和资源文件源码
  7. JSP页面中有一个按钮 点击之后执行JAVA文件
  8. 如何在Java中递归解压缩文件?
  9. Java获得文件的创建时间(精确到秒)

随机推荐

  1. android:screenOrientation属性
  2. 文字跑马灯
  3. Android 9.0 Launcher源码分析(三)——Laun
  4. android button 正常状态,按下状态
  5. BitmapFactory.Options学习笔记
  6. Android的Context简介
  7. Android中的一些开关
  8. Android Studio之安卓学习布局管理器
  9. [android]控件Button常用属性
  10. Android(安卓)NIO简易聊天室