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

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ew452182 小时前
ElementUI表格表头自定义添加checkbox,点击选中样式不生效
前端·javascript·elementui
suibian52352 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
Moon.92 小时前
el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
前端·vue.js·html
垚垚 Securify 前沿站3 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
工业甲酰苯胺5 小时前
Vue3 基础概念与环境搭建
前端·javascript·vue.js
mosquito_lover17 小时前
怎么把pyqt界面做的像web一样漂亮
前端·python·pyqt
柴柴的小记9 小时前
前端vue引入特殊字体不生效
前端·javascript·vue.js
柠檬豆腐脑9 小时前
从前端到全栈:新闻管理系统及多个应用端展示
前端·全栈
bin915310 小时前
DeepSeek 助力 Vue 开发:打造丝滑的颜色选择器(Color Picker)
前端·javascript·vue.js·ecmascript·deepseek