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

Expo-Camera调用pausePreview()在Android端无法暂停预览的问题

问题根因
  • 这是Expo-Camera在Android和iOS双端实现逻辑不一致导致的已知差异:Android端原生相机的takePictureAsync执行完成后,会默认自动触发一次预览重启操作,你在拍照后同步调用的pausePreview()会被这次自动重启操作覆盖,因此不生效。
  • 你的配置中开启了allowsEditing: true,Android端拍完照后会拉起系统编辑页,回到相机页时同样会触发预览重置,也会导致pausePreview失效。如果你的业务不需要编辑功能,可先将该参数改为false验证效果。
可行解决方案

方案1:添加延迟后执行暂停(最便捷)

等待Android端自动重启预览的逻辑执行完成后,再调用暂停方法,适配代码如下:

import { Platform } from 'react-native';

// 原有逻辑
const options = { quality: 0.25, base64: true, allowsEditing: true };
const data = await cameraRef.current.takePictureAsync(options);
setSource(data.uri);

// 适配双端逻辑
if (Platform.OS === 'android') {
  setTimeout(() => {
    cameraRef.current?.pausePreview();
  }, 200);
} else {
  await cameraRef.current.pausePreview();
}

注:延迟时长可根据自己的设备表现调整到100-300ms区间即可

方案2:用预览覆盖方案替代pausePreview(兼容性最好)

如果业务场景是拍照后需要停在当前拍摄画面,可直接在Camera组件上层叠一个同尺寸的Image组件,展示拍摄得到的data.uri,双端表现完全一致,不受底层相机逻辑影响:

// 视图部分示例
import { View, Camera, Image, StyleSheet } from 'react-native';

<View style={{position: 'relative', flex: 1}}>
  <Camera ref={cameraRef} style={{flex: 1}} />
  {source && <Image source={{uri: source}} style={StyleSheet.absoluteFillObject} resizeMode="cover" />}
</View>

方案3:升级Expo SDK版本

如果你使用的是SDK44及更早的Expo版本,Android端pausePreview本身存在未修复的官方bug,可升级到SDK45及以上版本,官方已修复部分双端逻辑不一致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:09:03