You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:16:12