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

React Native Expo Camera iOS端绿点常亮:是否需关闭相机?

iOS上Expo相机应用未使用时绿点持续亮起的解决方案

是的,当相机界面未处于使用状态时,你必须主动执行关闭相机的操作。iOS的相机监控机制会持续检测相机会话的活跃状态,只要相机资源没有被正确释放,系统就会判定相机仍在运行,绿点会一直亮起,还会额外消耗设备电量。

核心原因

Expo的Camera组件在挂载时会启动相机硬件会话,但组件卸载时并不会自动完全释放相机资源。iOS系统依赖相机会话的状态来判断是否显示绿点,未手动关闭的话,会话会保持活跃状态。

具体实现步骤

通过React的生命周期钩子(函数组件用useEffect的清理函数),在离开相机界面时主动关闭相机:

  • 用useRef获取相机实例的引用
  • 在组件卸载的清理函数中,调用相机实例的stopPreview()停止预览,再调用releaseCamera()释放相机资源
  • 确保所有退出相机界面的操作(比如导航返回、关闭模态框)都触发相机关闭逻辑

示例代码:

import { Camera } from 'expo-camera';
import { useEffect, useRef, useState } from 'react';
import { View, Button, Text } from 'react-native';

export default function CameraScreen({ navigation }) {
  const cameraRef = useRef(null);
  const [hasPermission, setHasPermission] = useState(null);

  useEffect(() => {
    // 请求相机权限并初始化
    (async () => {
      const { status } = await Camera.requestCameraPermissionsAsync();
      setHasPermission(status === 'granted');
    })();

    // 组件卸载时清理相机资源
    return () => {
      if (cameraRef.current) {
        cameraRef.current.stopPreview();
        cameraRef.current.releaseCamera();
      }
    };
  }, []);

  if (hasPermission === null) return <View />;
  if (hasPermission === false) return <Text>无相机访问权限</Text>;

  return (
    <View style={{ flex: 1 }}>
      <Camera ref={cameraRef} style={{ flex: 1 }} />
      <Button title="返回" onPress={() => navigation.goBack()} />
    </View>
  );
}

额外注意事项

  • 若使用了相机预览、拍照录像等功能,在完成操作后也应及时停止相关会话
  • 测试时可通过iOS「设置-隐私与安全性-相机」查看应用的相机使用状态,确认资源是否已释放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:45:27