uni-app安卓原生开发

创建模块

先创建一个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看到的却是两种类型

相关推荐
橘子星6 分钟前
🚀 手把手带你写一个端侧 AI 应用的"加载进度条"与"聊天对话框"
前端·人工智能
37.2℃99542 分钟前
专业的Claude Design解决方案
前端·算法
Jolyne_1 小时前
ng-zorro-table列宽resize后宽度是NaN的源码调试记录
前端
liwulin05061 小时前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
前端甜糖1 小时前
记录We码开发者工具的一个bug
前端·javascript
程序员黑豆1 小时前
鸿蒙应用开发教程:以红绿灯切换为例,掌握条件渲染的核心用法
前端·harmonyos
猫3281 小时前
echarts 日常问题解决
前端·javascript·echarts
新中地GIS开发老师1 小时前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发
我是大卫2 小时前
【图】React源码解析-从数据结构、调度器、源码设计模式到状态计算引擎,深挖useReducer原理
前端·react.js·源码
willes2 小时前
列表中的倒计时组件
前端