Android的网络浏览:注入本地JavaScript文件到远程网页 [英] Android Web-View : Inject local Javascript file to Remote Webpage

查看:574
本文介绍了Android的网络浏览:注入本地JavaScript文件到远程网页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这已经被问过很多次,我通过一切浏览,没有明确的解答。

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

问题简化为:是否有可能要在Android网络浏览加载远程页面本地JavaScript文件(从资产或存储)注资?我知道,这是可能的,例如文件注入到在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文件下载每次。我想避免网络视图缓存。

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 /的script.js)本地JavaScript文件,并规避在不允许加载本地资源:文件:///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.

这是类似于在另一个线程描述(<一href="http://stackoverflow.com/questions/5649111/android-webview-loading-javascript-file-in-assets-folder">Android web视图,加载JavaScript资产文件夹文件),额外的BASE64编码/解码再presenting你的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.

下面是一些code片段:

Here are some code snippets:

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

    ...

我希望它能帮助!

I hope it helps!

这篇关于Android的网络浏览:注入本地JavaScript文件到远程网页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆