yyb
4 天以前 0c04de484a2a2bebbd08a06a604c3cdbb7b9cb47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<template>
    <view>
        <view class="content">
            <!-- <text>扫描结果:{{ scanResult }}</text> -->
        </view>
    </view>
</template>
 
<script>
var main, receiver, filter;
var action, extraKey;
var _codeQueryTag = false;
 
export default {
    data() {
        return {
            scanCode: '',
            scanResult: ''
        }
    },
    created() {
        uni.getSystemInfo({
            success: (res) => {
                var brand = res.brand.toUpperCase();
                var model = res.model.toUpperCase();
 
                console.log('设备品牌:', brand);
                console.log('设备型号:', model);
 
                // Zebra设备配置
                if (brand.indexOf("ZEBRA") != -1 && model.indexOf("TC2") != -1) {
                    action = "com.zebra.scan";
                    extraKey = "com.motorolasolutions.emdk.datawedge.data_string";
                }
                // AUTOID9N设备配置
                else if (brand.indexOf("SEUIC") != -1 || brand.indexOf("AUTOID") != -1) {
                    // AUTOID9N专用配置
                    if (model.indexOf("AUTOID9N") != -1) {
                        action = "com.android.server.scannerservice.broadcast";
                        extraKey = "scannerdata"; // 或 "BARCODE_STRING",根据实际情况调整
                    }
                    // 其他SEUIC设备
                    else {
                        action = "com.android.server.scannerservice.broadcast";
                        extraKey = "scannerdata";
                    }
                }
                else {
                    console.log('未知设备品牌,无法初始化扫码');
                    return;
                }
 
                console.log('扫码广播配置:', { action, extraKey });
                this.initScan();
                this.startScan();
            },
            fail: (err) => {
                console.error('获取系统信息失败:', err);
            }
        });
    },
    onLoad() {
        // 监听全局扫码事件
        uni.$on('scan', (event) => {
            this.scanResult = event.code;
            console.log('扫码结果:', this.scanResult);
        });
    },
    onUnload() {
        this.stopScan();
        uni.$off('scan'); // 移除事件监听
    },
    methods: {
        initScan() {
            console.log('初始化扫码接收器');
 
            try {
                main = plus.android.runtimeMainActivity(); // 获取activity
                var IntentFilter = plus.android.importClass('android.content.IntentFilter');
                filter = new IntentFilter();
                filter.addAction(action);
 
                console.log('注册广播过滤器:', action);
 
                receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
                    onReceive: function (context, intent) {
                        console.log('接收到扫码广播');
 
                        try {
                            plus.android.importClass(intent);
                            let code = intent.getStringExtra(extraKey);
 
                            if (code) {
                                console.log('扫码内容:', code);
                                this.queryCode(code);
                            } else {
                                console.warn('扫码内容为空,可能ExtraKey不正确:', extraKey);
 
                                // 尝试备选ExtraKey
                                const altExtraKey = extraKey === "BARCODE_STRING" ? "scannerdata" : "BARCODE_STRING";
                                code = intent.getStringExtra(altExtraKey);
 
                                if (code) {
                                    console.log('使用备选ExtraKey获取到内容:', altExtraKey);
                                    this.queryCode(code);
                                }
                            }
                        } catch (e) {
                            console.error('处理扫码广播时出错:', e);
                        }
                    }.bind(this) // 确保this指向组件实例
                });
 
                console.log('扫码接收器初始化成功');
            } catch (e) {
                console.error('初始化扫码接收器失败:', e);
            }
        },
        startScan() {
            console.log('开始监听扫码广播');
 
            try {
                if (main && receiver && filter) {
                    main.registerReceiver(receiver, filter);
                    console.log('广播接收器已注册');
                } else {
                    console.error('无法注册广播接收器: 组件未初始化');
                }
            } catch (e) {
                console.error('注册广播接收器失败:', e);
            }
        },
        stopScan() {
            console.log('停止监听扫码广播');
 
            try {
                if (main && receiver) {
                    main.unregisterReceiver(receiver);
                    console.log('广播接收器已注销');
                }
            } catch (e) {
                console.error('注销广播接收器失败:', e);
            }
        },
        queryCode(code) {
            console.log('处理扫码结果:', code);
 
            if (_codeQueryTag) {
                console.log('忽略重复扫码');
                return false;
            }
 
            _codeQueryTag = true;
 
            // 防抖处理
            setTimeout(() => {
                _codeQueryTag = false;
            }, 150);
 
            // 触发全局事件
            uni.$emit('scan', { code });
        }
    }
}
</script>
 
<style></style>