Android JS 安全注入改进版

来源:互联网 发布:傅园慧网络直播平台 编辑:程序博客网 时间:2024/06/17 00:07

开源项目地址:Android-JS-Inject

让android的js注入更加简单,更加方便在 java与js端互传回调函数。

下面是一个简单的例子,完整代码和详细的使用方法见源项目,里面有demo。

FunctionActivity.java

package com.test.android.injectjs.demofunction;import android.app.Activity;import android.os.Bundle;import android.os.PersistableBundle;import android.webkit.WebView;import android.widget.Toast;import com.chenyg.androidjs.*;/** * 测试java与js之间的函数的传递。 */public class FunctionActivity extends Activity{    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        WebView wv = new WebView(this);        setContentView(wv);        WEBUtil.defaultSettings(wv);        Java2JsCallback java2JsCallback = new Java2JsCallback(new WEBViewImpl(wv))        {            @Callback            public void callback(String content)            {                Toast.makeText(FunctionActivity.this, content, Toast.LENGTH_SHORT).show();            }        };        java2JsCallback.setPermanent(true);        wv.setWebChromeClient(                new WEBChromeClient(false, true, new JsCallJava.InjectObj("demo.fun", new Js1(java2JsCallback))));        wv.loadUrl("file:///android_asset/test-fun/test.html");    }}

Js1.java

package com.test.android.injectjs.demofunction;import android.widget.Toast;import com.chenyg.androidjs.Java2JsCallback;import com.chenyg.androidjs.JsCallback;import com.chenyg.androidjs.WEBView;import org.json.JSONArray;import org.json.JSONObject;/** */public class Js1{    private Java2JsCallback java2JsCallback;    public void toast(WEBView webView, String message)    {        Toast.makeText(webView.getContext(), message, Toast.LENGTH_SHORT).show();    }    /**     * @param java2JsCallback 用于动态传递到js端的java函数对象。     */    public Js1(Java2JsCallback java2JsCallback)    {        this.java2JsCallback = java2JsCallback;    }    /**     * js函数直接作为java函数参数。     *     * @param view     * @param callback     */    public void jsFun(WEBView view, JsCallback callback)    {        try        {            callback.apply();        } catch (Exception e)        {            e.printStackTrace();        }    }    /**     * js函数作为json对象的内部变量。     *     * @param view     * @param jsonObject     */    public void jsFun(WEBView view, JSONObject jsonObject)    {        try        {            JsCallback callback = (JsCallback) jsonObject.get("callback");            callback.apply();        } catch (Exception e)        {            e.printStackTrace();        }    }    /**     * js函数作为json数组的元素。     *     * @param view     * @param jsonArray     */    public void jsFunArray(WEBView view, JSONArray jsonArray)    {        try        {            JsCallback callback = (JsCallback) jsonArray.get(0);            callback.apply();        } catch (Exception e)        {            e.printStackTrace();        }    }    /**     * js函数作为json对象的json数组的元素。     *     * @param view     * @param jsonObject     */    public void jsFunArray(WEBView view, JSONObject jsonObject)    {        try        {            JsCallback callback = (JsCallback) jsonObject.getJSONArray("array").get(0);            callback.apply();        } catch (Exception e)        {            e.printStackTrace();        }    }    /**     * 直接传递java函数对象。     *     * @param view     * @param callback     */    public void sendJavaFun(WEBView view, JsCallback callback)    {        try        {            callback.apply(java2JsCallback);        } catch (JsCallback.JsCallbackException e)        {            e.printStackTrace();        }    }    /**     * java函数对象作为json对象的一个变量。     *     * @param view     * @param callback     */    public void sendJavaFunInJson(WEBView view, JsCallback callback)    {        try        {            JSONObject jsonObject = new JSONObject();            jsonObject.put("callback", java2JsCallback);            callback.apply(jsonObject);        } catch (Exception e)        {            e.printStackTrace();        }    }}

test.html

<!DOCTYPE HTML><html><head>    <meta charset="utf-8">    <title>函数相关的测试</title>    <meta name="author" content="Yanyuetian">    <meta name="viewport"          content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1, target-densitydpi=medium-dpi, user-scalable=no">    <link href="../default.css" rel="stylesheet" type="text/css"/>    <script src="../jquery-2.2.3.min.js" type="text/javascript"></script>    <script src="../inject.js" type="text/javascript"></script>    <script type="text/javascript">    $(document).ready(function(){            console.log("ready!");            window.injectReady(false,function(){                demo.fun.toast('js已注入成功!');            });        });    </script></head><body><div class="blog-header">    <h3>函数相关的测试</h3></div><ul class="entry">    <li>        js函数直接作为java函数参数<br/>        代码:<br/>        <div>            demo.fun.jsFun(function(){                alert('js函数直接作为java函数参数');            });        </div>        <button onclick="demo.fun.jsFun(function(){alert('js函数直接作为java函数参数');});">测试</button>    </li>    <br/>    <li>        js函数作为json对象的内部变量<br/>        代码:<br/>        <div>            demo.fun.jsFun({                'callback':function(){                     alert('js函数作为json对象的内部变量');                }            });        </div>        <button onclick="demo.fun.jsFun({'callback':function(){alert('js函数作为json对象的内部变量');}});">测试</button>    </li>    <br/>    <li>        js函数作为json数组的元素<br/>        代码:<br/>        <div>            demo.fun.jsFunArray([function(){                 alert('js函数作为json数组的元素');            }]);        </div>        <button onclick="demo.fun.jsFunArray([function(){alert('js函数作为json数组的元素');}]);">测试</button>    </li>    <br/>    <li>        js函数作为json对象的json数组的元素<br/>        代码:<br/>        <div>            demo.fun.jsFunArray({                'array':[function(){                    alert('js函数作为json对象的json数组的一个元素');                     }]            });        </div>        <button onclick="demo.fun.jsFunArray({'array':[function(){alert('js函数作为json对象的json数组的一个元素');}]});">测试</button>    </li>    <br/>    <li>        直接传递java函数对象<br/>        代码:<br/>        <div>            demo.fun.sendJavaFun(function(javaCall){                javaCall('直接传递java函数对象');            });        </div>        <button onclick="demo.fun.sendJavaFun(function(javaCall){javaCall('直接传递java函数对象');});">测试</button>    </li>    <br/>    <li>        java函数对象作为json对象的一个变量<br/>        代码:<br/>        <div>            demo.fun.sendJavaFunInJson(function(obj){                obj.callback('java函数对象作为json对象的一个变量');            });        </div>        <button onclick="demo.fun.sendJavaFunInJson(function(obj){obj.callback('java函数对象作为json对象的一个变量');});">测试        </button>    </li></ul></body></html>



图1


图2

02

图3

03

0 0
原创粉丝点击