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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:15:38