uniapp H5与原生安卓的数据互通和方法调用
1、准备
我这里是uniapp与原生安卓之间的相互调用,也就是原生安卓内嵌H5页面,下面先来准备一下安卓端的代码。
(1)、初始化的MainActivity 类定义一个 WebView
private WebView webView;
(2)、初始化的方法onCreate 设置 WebView 的参数及各种设置,这里主要是开启js 的调用 和添加H5调用的类,相当于在项目启动的时候就加载H5需要调用的类。
@Override
@SuppressLint("JavascriptInterface")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CONTEXT = this.getBaseContext();
// H5调用的类,deviceInfo 是给类取得别名,调用的时候用到
webView.addJavascriptInterface(new DeviceInfo(), "deviceInfo");
// 添加js支持
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
}
(3)、H5调用的类,
public class DeviceInfo {
// H5调用的方法,这里的方法可以自己定义,和java的写法一样。
@JavascriptInterface
public String getDeviceId() {
//获取手机的Serial码
String deviceId = Build.SERIAL;
return deviceId;
}
@JavascriptInterface
public String getDeviceInfo() {
//获取手机的Serial码
String serialNumber = Build.SERIAL;
String deviceType = Build.DEVICE;
String deviceName = Build.PRODUCT;
Map<String,String> map = new HashMap<>();
map.put("serialNumber",serialNumber);
map.put("deviceType",deviceType);
map.put("deviceName",deviceName);
String toJson = new Gson().toJson(map);
return toJson;
}
}
这样前期的准备就做好了,当然原生安卓项目的创建这些我这里的就不讲了。
2、H5调原生安卓
1、H5代码
我这里是用uniapp写的H5页面,在 methods 模块 的方法里面,需要调原生安卓的地方:
let deviceId = window.deviceInfo.getDeviceId();
注意: window 是固定写法,deviceInfo 上面的取得类别名,getDeviceId 就是我们需要调的这个类里面的方法名了,这里我没有传参数,需要传参的直接加上实参参数就可以了,对应的方法也加上形参就可以了。
// H5调用的类,deviceInfo 是给类取得别名,调用的时候用到
webView.addJavascriptInterface(new DeviceInfo(), "deviceInfo");
2、原生安卓代码
这里就是上面写的代码,这里需要讲的就是需要返回参数到H5的直接 return 回去就可以了。
public class DeviceInfo {
@JavascriptInterface
public String getDeviceId() {
//获取手机的Serial码
String deviceId = Build.SERIAL;
return deviceId;
}
@JavascriptInterface
public String getDeviceInfo() {
//获取手机的Serial码
String serialNumber = Build.SERIAL;
String deviceType = Build.DEVICE;
String deviceName = Build.PRODUCT;
Map<String,String> map = new HashMap<>();
map.put("serialNumber",serialNumber);
map.put("deviceType",deviceType);
map.put("deviceName",deviceName);
String toJson = new Gson().toJson(map);
return toJson;
}
}
3、原生安卓调H5方法
这里我也网上找了很久,都是原生的H5 js 写法,因为我是用uniapp写的,所以和原生js写法不一样,这重点讲一下,我踩了一个大坑。
(1)原生安卓代码。
首先讲一下安卓端的代码,其实很简单。
// initializeData 为H5的方法,也就是uniapp的方法, payStatus 为需要传的参数。
webView.loadUrl("javascript:initializeData(" + payStatus + ")");
安卓端代码就完了,就这么简单,和网上找的帖子一样,都是这么调的,但是当时不知道的是,H5的方法怎么写。
(2)uniapp H5 的方法。
我的写法:在 mounted模块
mounted: function() {
// window 这应该是固定写法,initializeData 为原生安卓端调用的方法。
window.initializeData =function (e) {
// e为传回来的参数
// 自己的业务逻辑处理
}
},
刚刚在网上看到了一种写法,应该也可以的
created() {
window.getResult = this.getResult //注册到windows 调完原生方法之后 走h5的方法
},
methods: {
getResult(res){
//调用完成原生方法后,会走到这个方法
}
}
好了,这就是原生安卓与uinapp H5的参数和方法的相互调用的全部过程
uniapp H5与原生安卓的数据互通和方法调用