Urovo DT40扫码数据始终为空,React Native应用如何获取有效数据?
解决Urovo DT40扫码器在React Native中扫码数据为空的问题
问题背景
使用搭载Android 9系统的Urovo DT40条码扫描器,在React Native应用中尝试获取扫码信息时,数据始终返回null。设备扫码Intent输出设置如下:
- intent action:
android.intent.ACTION_DECODE_DATA - intent string extra:
barcode_string
用户代码示例:
const [barcodeContent, setBarcodeContent] = useState(null); const [modalVisible, setModalVisible] = useState(false); useEffect(() => { const listener = DeviceEventEmitter.addListener( "barcode_scan", (intent) => { const intentData = JSON.stringify(intent, null, 2); setBarcodeContent(intentData); setModalVisible(true); } ); DataWedgeIntents.registerBroadcastReceiver({ filterActions: ["android.intent.ACTION_DECODE_DATA"], filterCategories: ["android.intent.category.DEFAULT"], }); return () => { listener.remove(); }; }, []); return ( <View style={styles.container}> <Button title="Show Last Scan" onPress={() => setModalVisible(true)} /> <Modal visible={modalVisible} animationType="slide" transparent={true} onRequestClose={() => setModalVisible(false)} > <View style={styles.modalContainer}> <View style={styles.modalContent}> <Text style={styles.modalText}>Scanned Barcode:</Text> <Text style={styles.barcodeText}>{barcodeContent || "No data"}</Text> <Button title="Close" onPress={() => setModalVisible(false)} /> </View> </View> </Modal> </View> );
模态框输出结果:
{ "data": null, "labelType": null, "source": null }
解决方案
1. 明确指定要提取的Extra字段
默认的DataWedgeIntents不会自动映射设备自定义的Extra键,需要在注册广播接收器时添加extraKeys配置,指定要获取的barcode_string字段:
DataWedgeIntents.registerBroadcastReceiver({ filterActions: ["android.intent.ACTION_DECODE_DATA"], filterCategories: ["android.intent.category.DEFAULT"], extraKeys: ["barcode_string"] // 新增此行,匹配设备设置的Extra键 });
2. 修正监听器的数据提取逻辑
扫码数据实际存放在Intent的extras属性中,而非默认的data字段。调整监听器代码,从extras中读取barcode_string的值:
const listener = DeviceEventEmitter.addListener( "barcode_scan", (intent) => { const scannedData = intent.extras?.barcode_string; const intentData = JSON.stringify({ data: scannedData, labelType: intent.extras?.label_type || null, // 可选:如果设备返回条码类型可添加 source: "Urovo DT40" }, null, 2); setBarcodeContent(intentData); setModalVisible(true); } );
3. 验证设备DataWedge配置
- 确认设备DataWedge的输出Intent Action与代码中一致:
android.intent.ACTION_DECODE_DATA - 检查Extra字段名称是否为
barcode_string,Android的Extra键区分大小写,必须完全匹配 - 确保DataWedge将扫码结果发送到你的React Native应用对应的包名
4. 补充Android权限与清单配置
在AndroidManifest.xml中添加必要权限,确保应用能接收广播:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
同时在Activity标签下添加Intent过滤器,确保应用能捕获扫码广播:
<intent-filter> <action android:name="android.intent.ACTION_DECODE_DATA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
内容的提问来源于stack exchange,提问作者Marco Lembert
相关产品推荐
相关产品推荐

