WebAPP集成,本地打包,有两种方式java js通信
1.DCloud插件模式,参考SDK DEMO的H5Plugin,
Java:继承StandardFeature写接口。
public class DBControlPlugin extends StandardFeature
{
public void PluginTestFunction(IWebview pWebview, JSONArray array)
{
// 原生代码中获取JS层传递的参数,
// 参数的获取顺序与JS层传递的顺序一致
Log.d("DBControlPlugin", "PluginTestFunction");
String CallBackID = array.optString(0);
JSONArray newArray = new JSONArray();
newArray.put(array.optString(1));
newArray.put(array.optString(2));
newArray.put(array.optString(3));
newArray.put(array.optString(4));
// 调用方法将原生代码的执行结果返回给js层并触发相应的JS层回调函数
JSUtil.execCallback(pWebview, CallBackID, newArray, JSUtil.OK, false);
}
}
DCloud配置dcloud_properties.xml,增加<feature
name="DBControlPlugin "
value="com.example.H5PlusPlugin.DBControlPlugin " />
</features>
注意:配置文件中的name就是exec的第一个参数,value是java的类位置。
JS代码:window.plus.bridge.exec("DBControlPlugin", "PluginTestFunction", [callbackID, Argus1, Argus2, Argus3, Argus4]);
java调用js:JSUtil.execCallback可以调用js
js调用java: window.plus.bridge.exec
2.WebView的addJavascriptInterface方式,网上很多事例,此处只讲关键代码:
webView = SDK.obatinFirstPage(app).obtainWebview();
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsi");
java调用js: webView.loadUrl("javascript:jsText('"+text+"')");
js调用java: jsi.func
总结,2种方案都可以实现Native和JS互相调用通信。
7 个回复
desireyao - 安卓 html5
请问你现在解决了没?我也遇到此问题。
zhl
同样的方式webview.evalJS,webview集成方式OK,webApp集成方式就不行
zhl
webview.evalJS("jsonFromJava()", new ReceiveJSValue.ReceiveJSValueCallback() {
@Override
public String callback(JSONArray jsonArray) {
2016-05-20 15:17
2***@qq.com
已经解决了
2018-04-11 11:10
大帅锅
回复 2***@qq.com: 您好,我这边也是SDKWebApp形式加载的,一直不能在Android原生传数据到uniapp,请问您那边是怎么处理的啊?麻烦告知,万分感谢
2020-02-24 17:26
MUI_Charles
1***@163.com
同问
2***@qq.com - hacker
同问
2***@qq.com - hacker
WebAPP集成,本地打包,有两种方式java js通信
1.DCloud插件模式,参考SDK DEMO的H5Plugin,
Java:继承StandardFeature写接口。
public class DBControlPlugin extends StandardFeature
{
public void PluginTestFunction(IWebview pWebview, JSONArray array)
{
// 原生代码中获取JS层传递的参数,
// 参数的获取顺序与JS层传递的顺序一致
Log.d("DBControlPlugin", "PluginTestFunction");
String CallBackID = array.optString(0);
JSONArray newArray = new JSONArray();
newArray.put(array.optString(1));
newArray.put(array.optString(2));
newArray.put(array.optString(3));
newArray.put(array.optString(4));
// 调用方法将原生代码的执行结果返回给js层并触发相应的JS层回调函数
JSUtil.execCallback(pWebview, CallBackID, newArray, JSUtil.OK, false);
}
DCloud配置dcloud_properties.xml,增加<feature
name="DBControlPlugin "
value="com.example.H5PlusPlugin.DBControlPlugin " />
</features>
注意:配置文件中的name就是exec的第一个参数,value是java的类位置。
JS代码:window.plus.bridge.exec("DBControlPlugin", "PluginTestFunction", [callbackID, Argus1, Argus2, Argus3, Argus4]);
java调用js:JSUtil.execCallback可以调用js
js调用java: window.plus.bridge.exec
2.WebView的addJavascriptInterface方式,网上很多事例,此处只讲关键代码:
webView = SDK.obatinFirstPage(app).obtainWebview();
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsi");
java调用js: webView.loadUrl("javascript:jsText('"+text+"')");
js调用java: jsi.func
总结,2种方案都可以实现Native和JS互相调用通信。
Yee
ArrayList<IWebview> list = SDK.obtainAllIWebview();
for (IWebview v :
list) {
if (v.obtainFullUrl().contains("你想调用的js对应的HTML文件名")) {
v.executeScript("javascript:refresh()");
}