android h5 js 匿名函数通信

96
liwg
2018.04.25 10:25* 字数 243

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>

问题记录

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/

日记本