Android JS 安全注入改进版

开源项目地址: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 οnclick="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 οnclick="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 οnclick="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 οnclick="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 οnclick="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 οnclick="demo.fun.sendJavaFunInJson(function(obj){obj.callback('java函数对象作为json对象的一个变量');});">测试
        </button>
    </li>
</ul>

</body>
</html>



图1


图2

02

图3

03

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值