Skip to content

lwugang/android-js-bridge

Repository files navigation

android-js-bridge

###android js 互相调用

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

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

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

Add the dependency

    dependencies {
	    compile 'com.github.lwugang:android-js-bridge:v0.1.6'
	}

####使用方式

	<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>

###版本历史 ###v0.0.2

  • #####修改注入方式,插件类中被注入的方法必须加上 @JsInject 注解标记 ###v0.0.5
  • #####修改注入bug ###v0.1.1
  • #####修改注入bug保证100%注入成功 ###v0.1.4
  • #####修改注入bug,优化注入,提高注入成功率,保证100%注入成功 ###v0.1.6
  • #####修复bug,多个回调,生成的函数id重复造成多个函数执行同一个逻辑的问题

#Android7.0 webview 的一个坑(内部已处理) ###Android7.0不会调用此方法

@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
}

###Android7.0 需要重写此方法

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

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

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