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 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js
Mr.咕咕1 小时前
Django 搭建数据管理web——商品管理
前端·python·django