创建模块
先创建一个UniModule
java
public class MyUniModule extends UniModule {
}
然后把该模块添加到dcloud_uniplugins.json文件中
里面可以正常写属性和方法,对于需要暴露给uni-app使用的方法要加 @UniJSMethod(uiThread = boolean)
引用模块
在uni-app,可以通过uni.requireNativePlugin('MyUniModule')调用该模块的实例
javascript
const myModule = uni.requireNativePlugin('MyUniModule')
异步函数例子
java
@UniJSMethod(uiThread = true)
public void init(UniJSCallback callback) {
//do something...
callback.invoke("success");
}
在uni-app,通过回调函数方式可以获取回传参数
javascript
myModule.init(res => {
console.log(res) // 'success'
}
同步函数例子,直接返回
java
private String str = "abc";
@UniJSMethod(uiThread = false)
public void getString() {
return str;
}
在uni-app里可以直接获取
javascript
console.log(myModule.getString()) // 'abc'
如果需要获取AppContext或者App Activity,可以通过 mUniSDKInstance.getContext()
获取。
如果需要在原生插件请求权限ActivityCompat.requestPermissions((Activity) mUniSDKInstance.getContext(), permissions, permissionRequestCode)
比如请求蓝牙权限
java
int permissionRequestCode = 10008;
public boolean checkPermission() {
String[] PERMISSIONS_STORAGE = {
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN
}
// 判断是否缺少相关权限
boolean isLackPermission = false;
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(mUniSDKInstance.getContext(), permission) != PackageManager.PERMISSION_GRANTED) {
isLackPermission = true;
break;
}
}
// 申请权限
if (isLackPermission) {
ActivityCompat.requestPermissions((Activity) mUniSDKInstance.getContext(), permissions, permissionRequestCode);
return false;
}
return true;
}
如果需要在获取权限后,执行操作,可以通过重写 onRequestPermissionsResult
方法。注意需要设定requestCode来作为权限请求识别码。另外在 onRequestPermissionsResult
方法,不可以进行请求权限操作,否则会导致程序的onPause-onResume死循环。
java
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == permissionRequestCode) {
boolean isAllGranted = true;
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
//获取权限之后需要做的操作
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
广播事件
除了同步、异步,还有一种常用通讯方式:广播事件 比如,蓝牙连接成功事件,通知uni-app。result可以为HashMap或者null
java
String GLOBAL_EVENT_DEVICE_CONNECT = "event_device_connect";
mUniSDKInstance.fireGlobalEventCallback(GLOBAL_EVENT_DEVICE_CONNECT, result);
在uni-app中,可以通过 plus.globalEvent.addEventListener
监听广播事件
javascript
//监听设备连接情况 event_watch_device_connect
//#ifdef APP-PLUS
plus.globalEvent.addEventListener('event_device_connect', (result) => {
console.log('event_device_connect', result);
})
//#endif
其他
在uni-app调用模块方法,传入的参数会和前端理解有差异,比如我传一个对象如下
javascript
const myModule = uni.requireNativePlugin('MyUniModule')
myModule.callMethod({//这一层是HashMap<String, Object>
a: 111,
b: 222,
c: {//这一层是com.alibaba:fastjson
d: 333
}
})
可以看出,虽然在前端都是简单的对象,但在安卓debug看到的却是两种类型