美文网首页程序员
android h5 js 匿名函数通信

android h5 js 匿名函数通信

作者: leewug | 来源:发表于2018-04-25 10:25 被阅读0次

android js 互相调用

  • 支持js匿名函数接收
  • 支持js json对象接收
  • 支持js函数返回值获取
  • 通过注解注入js方法,支持自定义方法名

github https://github.com/lwugang/android-js-bridge

Add it in your root build.gradle at the end of repositories:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

Add the dependency

    dependencies {
        // 最新版本 26e67c0c78
        compile 'com.github.lwugang:android-js-bridge:26e67c0c78'
    }

使用方式

    <com.wugang.jsbridge.library.BridgeWebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/web_view"/>

Activity

  • A对象表示注入的插件对象,必须实现JsPlugin接口,所有需要注入的方法必须加 @JsInject 注解标记
  • 或者在类上声明@JsInject 该类中的所有public就会被注入
  • 如果该类中的方法不希望被注入可以 对方法加上@NoInject注解
    package com.src.wugang.jsbridge;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.Toast;
    import com.wugang.jsbridge.library.BridgeWebView;
    import com.wugang.jsbridge.library.JSFunction;
    import com.wugang.jsbridge.library.JsPlugin;
    import com.wugang.jsbridge.library.JsReturnValueCallback;
    import com.wugang.jsbridge.library.anno.JsInject;
    import com.wugang.jsbridge.library.utils.ImagePickerPluginUtils;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    public class MainActivity extends AppCompatActivity {

    private ImagePickerPluginUtils imagePickerPlugin ;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BridgeWebView webView = (BridgeWebView) findViewById(R.id.web_view);
        webView.addJavascriptInterface(new A(), "android");
        webView.addJavascriptInterface(new B(), "ui");
        webView.loadUrl("file:///android_asset/test.html");
        imagePickerPlugin = ImagePickerPluginUtils.getInstance(this);
    }

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        imagePickerPlugin.onActivityResult(requestCode,resultCode,data);
    }

    @JsInject
    public class A implements JsPlugin {

    public String getResult() {//不支持此中方式返回数据给js
      return "getResult";
    }
    public void testFun(JSFunction jsFunction){
      jsFunction.execute("testFun");
    }
    @JsInject("ddd")//注入方法重命名
    public void testFunReturn(JSFunction jsFunction){
      jsFunction.execute(new JsReturnValueCallback() {
        @Override public void onReturnValue(String result) {
          Toast.makeText(MainActivity.this,result,0).show();
        }
      },"testFunReturn");
    }
    }

    public class B implements JsPlugin {

    @JsInject("showImagePicker")
    public void test(String data,JSFunction function) {
      Toast.makeText(getApplicationContext(), data + "--", 1).show();
      JSONObject jsonObject = new JSONObject();
      try {
        jsonObject.put("loginState",true);
        JSONArray array = new JSONArray();
        array.put(data);
        jsonObject.put("arr",array);
      } catch (JSONException e) {
        e.printStackTrace();
      }
      function.execute(jsonObject);
    }
  }
}

HTML&JS代码

<html>
    <script>
        function test(){
            ui.showImagePicker("showImagePicker",function(d){
                   alert(d)
                 //  document.getElementById('img01').src='data:image/png;base64,'+JSON.parse(d).images[0];
            });
        }
        function testFun(){
            android.testFun(function(data){
                alert(data);
            });
        }
        function testFunReturn(){
            android.ddd(function(data){
                alert(data);
                return "testFunReturn";
            });
        }
        function getResult(){//这种形式是获取不到数据的
            var result = android.getResult();
            alert(result);
        }
    </script>
    <body>
        <button onclick="getResult()">getResult</button>
        <button onclick="testFun()">testFun</button>
        <button onclick="testFunReturn()">testFunReturn</button>
        <button onclick="test()">select img</button>
        <img src="" id="img01" width="400" height="400"/>
    </body>
</html>

image

问题记录

Android7.0 webview 不会调用此方法
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
}

Android7.0 需要重写此方法

@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
}

推荐使用第二版https://github.com/lwugang/android-js-bridge-v2

参考项目https://github.com/lwugang/safe-java-js-webview-bridge

参考项目https://github.com/dukeland/EasyJSWebView

更多博客内容请关注:http://boke.liwg.top/

相关文章

  • android h5 js 匿名函数通信

    android js 互相调用 支持js匿名函数接收 支持js json对象接收 支持js函数返回值获取 通过注解...

  • android js bridge 互相调用第二版

    android-js-bridge-v2 android js 互相调用 第二版 1. 支持js匿名函数接收 2....

  • js 深入

    * js语法* js的动态函数和匿名函数* js动态函数Functionnew Function();* 匿名函数...

  • h5页面 判断网页在哪打开

    获取浏览类型与系统的函数 前端H5用js判断页面在IOS,Android,微信,pc端打开的方法 js判断H5页面...

  • JS操作属性、函数

    JS操作style属性 JS操作class属性 函数 匿名函数 函数传参 作业 if练习 switch练习

  • PHP闭包

    一. 闭包函数又叫做匿名函数(没有函数名称的函数). 英文closure 匿名函数常在js函数中出现,比如ajax...

  • 【JS】匿名函数

    本节讲解 3 种原生JS的匿名函数。 匿名函数又叫立即执行函数。 因为是匿名的,所以不能被调用。 因为不能被调用,...

  • 2018-12-01

    js中括号操作属性 js函数 js换肤 变量和函数预解析 匿名函数 函数传参 函数return关键字 流程控制语句...

  • js 匿名函数 this的指向问题

    js匿名函数的this通通指向window

  • 2018-07-09

    JS匿名函数理解 匿名函数的基本形式为(function(){...})();前面的括号包含函数体,后面的括号就是...

网友评论

    本文标题:android h5 js 匿名函数通信

    本文链接:https://www.haomeiwen.com/subject/eeeelftx.html