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

expo-camera/next在Android端崩溃求助:权限或实现问题排查

Expo Camera Next Android崩溃排查方案(权限及代码逻辑问题)

一、先检查Android权限配置

  • 确认app.json中已声明相机权限,Expo managed workflow下需在expo.android.permissions数组中添加CAMERA:
    {
      "expo": {
        "android": {
          "permissions": ["CAMERA"]
        }
      }
    }
    
  • 若使用bare workflow,需在AndroidManifest.xml中手动添加权限:
    <uses-permission android:name="android.permission.CAMERA" />
    

二、修正权限请求逻辑

原代码在组件渲染阶段直接调用requestPermission(),会触发重复请求及渲染循环,改用useEffect处理权限请求更合理:

const [permission, requestPermission] = useCameraPermissions();

useEffect(() => {
  // 仅在权限未授予且可再次请求时触发
  if (!permission?.granted && permission?.canAskAgain) {
    requestPermission();
  }
}, [permission]);

if (!permission) {
  // 权限加载中显示加载状态,而非空View
  return <ActivityIndicator size="large" style={{ flex: 1 }} />;
}

if (!permission.granted) {
  // 权限未授予时引导用户手动开启,而非空View
  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text>需要相机权限才能使用扫码功能</Text>
      <TouchableOpacity onPress={requestPermission} style={{ marginTop: 16 }}>
        <Text>点击开启权限</Text>
      </TouchableOpacity>
    </View>
  );
}

三、排查代码中的致命错误

原代码存在多处未定义变量/函数,这是Android崩溃的核心诱因:

  1. tab变量未声明:需补充状态定义
    const [tab, setTab] = useState("camera");
    
  2. handleBarCodeScanned函数未实现:补充扫码回调逻辑
    const handleBarCodeScanned = ({ data }) => {
      setScanned(true);
      setPatient(data);
      // 后续业务逻辑...
    };
    
  3. closePopUp函数未实现:补充弹窗关闭逻辑
    const closePopUp = () => {
      setModalFlag(false);
      setScanned(false);
      setTab("camera");
    };
    

四、Android额外注意事项

  • 确保Expo SDK版本与expo-camera/next版本兼容,建议使用最新稳定版,避免版本不匹配导致的底层崩溃
  • Android 13+无需额外权限,相机权限仅需CAMERA即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:07:51