io.dcloud.feature.internal.reflect.BroadcastReceiver在android 12中无法接受数据
io.dcloud.feature.internal.reflect.BroadcastReceiver在android 12中无法接受数据
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 11 | HBuilderX |
Android | 12 |
示例代码:
<template> <view></view> </template> <script> import {mapState} from 'vuex'; let main, receiver, filter; let _codeQueryTag = false; export default { data() { return { scanCode: '' } }, computed: { ...mapState({ action: state => state.broadcastSettings.broadcastSettings.action, tag: state => state.broadcastSettings.broadcastSettings.tag }) }, created: function(option) { this.initScan() this.startScan(); }, onHide: function() { this.stopScan(); }, destroyed: function() { /*页面退出时一定要卸载监听,否则下次进来时会重复,造成扫一次出2个以上的结果*/ this.stopScan(); }, methods: { initScan() { let _this = this; main = plus.android.runtimeMainActivity(); //获取activity let IntentFilter = plus.android.importClass('android.content.IntentFilter'); filter = new IntentFilter(); //filter.addAction(this.action); // 换你的广播动作 filter.addAction("android.intent.ACTION_DECODE_DATA") receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', { onReceive: (context, intent) => { plus.android.importClass(intent); main.sendBroadcast(intent); let saction = intent.getAction(); //let code = intent.getStringExtra(this.tag); // 换你的广播标签 let code = intent.getStringExtra("barcode_string"); // 换你的广播标签 console.log('before before before',this.action,saction,this.tag,"barcode",code); code = code.replace(/\000026/g, ''); // try // { // let barcodeBytes = intent.getByteArrayExtra("barcode"); // let barcode = this.byteToString(barcodeBytes); // console.log('byte before', barcodeBytes,barcode); // } // catch(e){ // console.log(e) // } _this.queryCode(code); } }); }, byteToString(arr) { if (typeof arr === 'string') { return arr; } var str = '', _arr = arr; for (var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if (v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for (var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str; } , startScan() { console.log("register") main.registerReceiver(receiver, filter); }, stopScan() { console.log("unregister") main.unregisterReceiver(receiver); }, queryCode(code) { //防重复 if (_codeQueryTag) return false; _codeQueryTag = true; setTimeout(function() { _codeQueryTag = false; }, 150); let id = code console.log('id:', id) uni.$emit('scancodedate', { code: id }) } } } </script> <style lang="scss"></style>
1 回复
在Android 12中,由于系统对广播接收的限制更加严格,导致io.dcloud.feature.internal.reflect.BroadcastReceiver
无法正常接收数据。这是Android 12引入的"Broadcast Limitations"导致的,主要解决方案如下:
- 需要添加
RECEIVER_EXPORTED
或RECEIVER_NOT_EXPORTED
标志:
let flags = plus.android.importClass('android.content.Context');
main.registerReceiver(receiver, filter, flags.RECEIVER_EXPORTED);
- 确保在AndroidManifest.xml中声明了广播接收器:
<receiver android:name="io.dcloud.feature.internal.reflect.BroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.ACTION_DECODE_DATA" />
</intent-filter>
</receiver>
- 如果仍然有问题,可以尝试改用动态注册方式:
let Context = plus.android.importClass('android.content.Context');
let intent = new Intent("android.intent.ACTION_DECODE_DATA");
intent.setPackage(main.getPackageName());
main.sendBroadcast(intent);