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

相关推荐
秃了也弱了。3 分钟前
Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器
前端·chrome
乆夨(jiuze)23 分钟前
记录H5内嵌到flutter App的一个问题,引发后面使用fastClick,引发后面input输入框单击无效问题。。。
前端·javascript·vue.js
忧郁的蛋~44 分钟前
HTML表格导出为Excel文件的实现方案
前端·html·excel
小彭努力中1 小时前
141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
前端·javascript·vue.js·交互
然我1 小时前
别再只用 base64!HTML5 的 Blob 才是二进制处理的王者,面试常考
前端·面试·html
NanLing1 小时前
【纯前端推理】纯端侧 AI 对象检测:用浏览器就能跑的深度学习模型
前端
呆呆的心1 小时前
前端必学:从盒模型到定位,一篇搞定页面布局核心 🧩
前端·css
小飞悟1 小时前
前端高手才知道的秘密:Blob 居然这么强大!
前端·javascript·html
小old弟1 小时前
用Sass循环实现炫彩文字跑马灯效果
前端
code_YuJun1 小时前
Promise 基础使用
前端·javascript·promise