Android Web端Expo-Camera切换摄像头时提示“camera not working”问题
Expo Camera Android端切换摄像头报错“camera not working”的解决办法
下面是几个经过验证的解决方案,按优先级尝试:
- 切换前重新请求摄像头权限
Android系统中,切换摄像头时偶尔会出现权限状态异常,主动重新请求权限可以避免这类问题:
import { Camera, CameraPermissions } from 'expo-camera'; const toggleCamera = async () => { const { status } = await CameraPermissions.requestAsync(); if (status === 'granted') { setCameraType(prev => prev === Camera.Constants.Type.back ? Camera.Constants.Type.front : Camera.Constants.Type.back ); } else { alert('需要授予摄像头权限才能切换'); } };
- 通过卸载重绘Camera组件解决资源冲突
直接修改type属性可能导致Android端摄像头资源未正确释放,用状态控制组件的卸载和重新渲染:
import React, { useState } from 'react'; import { View, Button } from 'react-native'; import { Camera } from 'expo-camera'; export default function CameraScreen() { const [cameraType, setCameraType] = useState(Camera.Constants.Type.back); const [showCamera, setShowCamera] = useState(true); const toggleCamera = () => { setShowCamera(false); // 短暂延迟确保组件卸载完成 setTimeout(() => { setCameraType(prev => prev === Camera.Constants.Type.back ? Camera.Constants.Type.front : Camera.Constants.Type.back ); setShowCamera(true); }, 100); }; return ( <View style={{ flex: 1 }}> {showCamera && ( <Camera style={{ flex: 1 }} type={cameraType} /> )} <Button title="切换摄像头" onPress={toggleCamera} /> </View> ); }
- 切换时先暂停预览再重启
部分Android设备上,直接切换摄像头会导致预览进程异常,通过控制预览状态可以规避:
import React, { useRef, useState } from 'react'; import { View, Button } from 'react-native'; import { Camera } from 'expo-camera'; export default function CameraScreen() { const cameraRef = useRef(null); const [cameraType, setCameraType] = useState(Camera.Constants.Type.back); const toggleCamera = async () => { if (!cameraRef.current) return; await cameraRef.current.pausePreview(); setCameraType(prev => prev === Camera.Constants.Type.back ? Camera.Constants.Type.front : Camera.Constants.Type.back ); // 延迟重启预览,给摄像头资源切换留时间 setTimeout(async () => { await cameraRef.current.startPreview(); }, 50); }; return ( <View style={{ flex: 1 }}> <Camera ref={cameraRef} style={{ flex: 1 }} type={cameraType} /> <Button title="切换摄像头" onPress={toggleCamera} /> </View> ); }
- 升级expo-camera到最新稳定版
旧版本的expo-camera存在Android端切换摄像头的已知bug,执行命令升级:
expo install expo-camera
内容的提问来源于stack exchange,提问作者mingmingming
相关产品推荐
相关产品推荐

