uniapp开发安卓App注意事项
-
使用安卓调试基座进行调试大大降低了uniapp开发安卓app的门槛
-
安卓开发经常需要调用到安卓原生的api,例如广播,扫码,相机等等,uniapp内置了App端的HTML5+规范,可以使用js直接调用丰富的原生能力。例如在安卓中调用原生的激光扫描能力:
let main, receiver, filter, intentInstance let scanFlag = false // 是否开启了激光扫描,默认关闭 /** * 初始化激光扫描 * @param {String} broadcastAction 广播动作 * @param {String} broadcastTag 广播标签 */ function initScan(broadcastAction, broadcastTag) { // 条件编译 HTML5+ 扩展规范,否则运行到h5、小程序等平台会出现 plus is not defined 错误 // #ifdef APP-PLUS // 获取Android主Activity main = plus.android.runtimeMainActivity() // 获取Android意图过滤类 let IntentFilter = plus.android.importClass('android.content.IntentFilter') // 实例化意图过滤 filter = new IntentFilter() // 获取意图广播,addAction内改为广播动作 filter.addAction(broadcastAction) receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', { onReceive: function (context, intent) { plus.android.importClass(intent) // getStringExtra内改为广播标签 let code = intent.getStringExtra(broadcastTag) console.log('广播监听扫描信息 ==== code :', code) emits('getCode', code) } }) // #endif } function startScan() { // #ifdef APP-PLUS if (!scanFlag) { main.registerReceiver(receiver, filter) console.log('==== 开启扫描') scanFlag = true } // #endif } function stopScan() { // #ifdef APP-PLUS if (scanFlag) { main.unregisterReceiver(receiver) console.log('==== 关闭扫描') scanFlag = false } // #endif } /** * 手动调用扫描 (非PDA物理按键) * @param {Object} keyAction 按键广播动作 */ function clickToScan(keyAction) { // #ifdef APP-PLUS // 获取Android意图类 let Intent = plus.android.importClass('android.content.Intent') // 实例化意图 intentInstance = new Intent() // 定义意图,模拟按下激光的物理按键映射,由厂商提供 intentInstance.setAction(keyAction) // 广播这个意图 main.sendBroadcast(intentInstance) // #endif } onMounted(() => { // PDA设备 (厂商提供) 广播动作:android.intent.ACTION_DECODE_DATA,广播标签:barcode_string initScan('android.intent.ACTION_DECODE_DATA', 'barcode_string') // 开启扫描 startScan() }) onUnmounted(() => { // 关闭扫描 stopScan() })
该plus对象便是uniapp内置的HTML5+规范,无需引入,直接使用,但是建议搭配条件编译写法,否则会在其他端报 plus is not defined 错误
HTML5+官方文档 HTML5+规范
-
除了使用HTML5+规范调用安卓原生能力,uniapp官方也对uni对象内置了相关设备方法
官方文档 系统设备
例如调用相机扫码
function onCameraScan() { // #ifdef APP uni.scanCode({ success: function (res) { scanCode.value = res.result console.log('扫描成功--->', scanCode.value) }, fail: function (err) { console.log('扫描失败--->', err) }, complete: function (res) { console.log('扫描完成--->', res) } }) // #endif }