Expo Camera 13.9.0搭配TensorFlow.js的cameraWithTensors时,Camera.Constants.Type.back无法正常工作
Expo Camera 13.9.0搭配TensorFlow.js的cameraWithTensors时,Camera.Constants.Type.back无法正常工作
兄弟,我之前也踩过Expo Camera搭配TensorFlow.js的cameraWithTensors的坑,尤其是你说的这个13.9.0版本后置摄像头指定无效的问题,给你分享几个我当时排查和解决的思路:
先检查Expo Camera的常量命名变化
Expo Camera在13.x版本后对常量做了简化导出,原来的Camera.Constants.Type.back可能已经被废弃了,现在官方推荐直接用CameraType.back。你需要先从expo-camera里导入CameraType,然后替换掉原来的写法:import { Camera, CameraType } from 'expo-camera'; // 组件里的type属性替换成这个 type={CameraType.back}我当时就是因为没注意到这个API变更,折腾了好久才发现问题。
确认摄像头权限是否完全获取
有时候看似是摄像头类型设置的问题,实则是权限没到位。你要确保两点:- 在
app.json里已经配置了摄像头的权限声明; - 代码里主动请求了摄像头权限,比如:
const [hasPermission, setHasPermission] = useState(null); useEffect(() => { (async () => { const { status } = await Camera.requestCameraPermissionsAsync(); setHasPermission(status === 'granted'); })(); }, []);如果权限没获取到,App会默认使用前置摄像头或者直接无法启动摄像头,看起来就像是
type设置无效。- 在
排查版本兼容性问题
TensorFlow.js的cameraWithTensors可能对Expo Camera的新版本适配有延迟。你可以试试两个方向:- 暂时把Expo Camera降级到13.8.0这类之前的稳定版本,看后置摄像头能不能正常工作;
- 直接写一个极简的原生Expo Camera Demo(不用cameraWithTensors),设置
type={CameraType.back},如果原生组件都无法正常启动后置摄像头,那就是Expo Camera本身的版本问题,反之则是cameraWithTensors的适配问题。
临时修复:手动切换摄像头
如果上面的方法都没用,你可以试试绕开直接设置type的方式,通过ref手动切换摄像头:import React, { useRef, useEffect } from 'react'; import { cameraWithTensors } from '@tensorflow/tfjs-react-native'; import { Camera, CameraType } from 'expo-camera'; const TensorCamera = cameraWithTensors(Camera); export default function App() { const cameraRef = useRef(null); useEffect(() => { // 组件挂载后手动切换到后置摄像头 if (cameraRef.current) { cameraRef.current.switchCamera(); } }, []); return ( <TensorCamera ref={cameraRef} type={CameraType.front} // 先默认前置,再手动切换 className="w-full h-full" cameraTextureHeight={texturedims.height} cameraTextureWidth={texturedims.width} resizeHeight={200} resizeWidth={152} resizeDepth={3} // 其他必要的props... /> ); }我当时就是用这个临时方案先解决了问题,后来等tfjs更新适配后就正常了。
备注:内容来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

