android js 互相調(diào)用
-
支持js匿名函數(shù)接收
-
支持js json對(duì)象接收
-
支持js函數(shù)返回值獲取
-
通過(guò)注解注入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對(duì)象表示注入的插件對(duì)象,必須實(shí)現(xiàn)JsPlugin接口,所有需要注入的方法必須加 @JsInject 注解標(biāo)記
- 或者在類(lèi)上聲明@JsInject 該類(lèi)中的所有public就會(huì)被注入
- 如果該類(lèi)中的方法不希望被注入可以 對(duì)方法加上@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() {//不支持此中方式返回?cái)?shù)據(jù)給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(){//這種形式是獲取不到數(shù)據(jù)的
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>
問(wèn)題記錄
Android7.0 webview 不會(huì)調(diào)用此方法
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
}
Android7.0 需要重寫(xiě)此方法
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
}
推薦使用第二版https://github.com/lwugang/android-js-bridge-v2
參考項(xiàng)目https://github.com/lwugang/safe-java-js-webview-bridge
參考項(xiàng)目https://github.com/dukeland/EasyJSWebView
更多博客內(nèi)容請(qǐng)關(guān)注:http://boke.liwg.top/