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

Expo BarCodeScanner在部分Android设备扫码时崩溃问题咨询

Expo BarCodeScanner部分Android设备扫码崩溃的已知问题及修复建议

这确实是Expo BarCodeScanner组件在部分Android设备上存在的已知兼容性问题,不少开发者反馈在小米、OPPO等品牌的部分机型,或者Android 11/12的部分子版本上会出现扫码崩溃重启的情况。结合你的代码,给出以下排查和修复建议:

1. 优化权限检查逻辑

你已经导入了useFocusEffect但未使用,配合React Navigation的页面切换场景,用它替代useEffect请求权限,能避免页面失焦再聚焦后权限状态失效的问题:

useFocusEffect(
  React.useCallback(() => {
    (async () => {
      const { status } = await BarCodeScanner.requestPermissionsAsync();
      setHasPermission(status === 'granted');
      setScanned(false); // 页面重新聚焦时允许再次扫码
    })();
  }, [])
);

2. 修复振动API的兼容性问题

部分Android设备的振动服务有系统限制,直接调用Vibration.vibrate()可能触发异常,建议添加平台判断和异常捕获:

const handleBarCodeScanned = ({ data }) => {
  // 优化振动逻辑
  try {
    if (Platform.OS === 'android') {
      Vibration.vibrate(200); // 指定短时长振动,避免触发系统限制
    } else {
      Vibration.vibrate();
    }
  } catch (err) {
    console.warn('振动触发失败:', err);
  }

  if (!scanned) {
    setVoucher('');
    scanApi(data);
    setScanned(true);
  } else {
    setData(data);
  }
}

3. 调整扫码组件的布局方式

直接用Dimensions设置固定宽高,在部分设备的屏幕适配场景下可能导致组件渲染异常,改用绝对填充布局更稳定:

return (
  <View style={{ flex: 1 }}>
    <BarCodeScanner
      style={StyleSheet.absoluteFillObject}
      onBarCodeScanned={scanned ? undefined : handleBarCodeScanned}
    />
  </View>
);

4. 给异步函数添加异常捕获

scanApi作为异步函数,未处理异常可能导致崩溃,建议包裹try-catch:

const scanApi = async (data) => {
  try {
    console.log(data);
    // 后续API请求逻辑也需要用try-catch包裹
  } catch (err) {
    console.error('扫码处理失败:', err);
    setScanned(false); // 失败后允许重新扫码
  }
}

额外排查步骤

  • 用expo logs --android命令查看崩溃的具体错误栈,定位核心问题
  • 将Expo SDK升级到最新稳定版,旧版本的BarCodeScanner存在较多兼容性bug
  • 测试时关闭设备的省电模式、摄像头权限限制等系统设置

内容的提问来源于stack exchange,提问作者CodeRic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:27:37