w***@21cn.com
w***@21cn.com
  • 发布:2025-05-28 12:09
  • 更新:2025-05-28 12:09
  • 阅读:19

io.dcloud.feature.internal.reflect.BroadcastReceiver在android 12 中无法接受数据

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows 11

HBuilderX类型: 正式

HBuilderX版本号: 4.66

手机系统: Android

手机系统版本号: Android 12

手机厂商: 优博讯PDA

手机机型: i8310T

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

<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>

操作步骤:

调试中console.log的值是空字符串

预期结果:

希望得到正确的数据

实际结果:

接受数据是空字符串

bug描述:

android 12 使用io.dcloud.feature.internal.reflect.BroadcastReceiver在onReceive事件有触发,但没办法接受数据是空,已确认广播标签等设置没问题

2025-05-28 12:09 负责人:无 分享
已邀请:

要回复问题请先登录注册