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看到的却是两种类型

相关推荐
再吃一根胡萝卜1 分钟前
从 Element UI 到 Element Plus:el-table 大数据量性能为何下降了?
前端
转转技术团队3 分钟前
转转UI自动化走查方案探索
前端
yzx9910137 分钟前
基于Flask的智能语音增强系统模拟
前端·javascript·html
青衫码上行12 分钟前
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式
java·前端·javascript·学习·正则表达式
草帽lufei23 分钟前
解锁AI新维度:深入体验Google Antigravity的Gemini3模型
前端·ai编程·gemini
CoolerWu29 分钟前
TRAE SOLO实战:一个所见即所得的笔记软体
前端·trae
没落英雄31 分钟前
简单了解 shadowDom
前端·html
天才熊猫君33 分钟前
vue3 基于 el-table 的无限滚动自定义指令实现
前端·javascript
陳陈陳33 分钟前
AIGC 时代,用自然语言操作数据库:SQLite + LLM 的轻量级实践
前端·数据库·python
星迷朦龙34 分钟前
使用剪贴版复制网页内容
前端