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

Expo Camera的takePictureAsync无返回:Promise未兑现的Android真机问题

解决Expo Camera组件在Android真机上takePictureAsync Promise挂起的问题

你遇到的是Expo Camera在Android真机上拍照Promise无法resolve的典型场景——模拟器正常但真机失效,大概率是权限、配置或版本兼容性导致的,下面给你几个针对性的解决方案:

1. 先捕获错误信息,定位问题根源

你的代码里没有对await操作做错误捕获,Promise可能已经被rejected但你看不到错误日志。先修改snap函数加上try-catch,这样能拿到具体的错误原因:

snap = async () => { 
  if (this.camera) { 
    console.log("SNAP!"); 
    try {
      // 先传入简单配置测试
      let photo = await this.camera.takePictureAsync({ quality: 0.5 }); 
      console.log(photo); 
    } catch (error) {
      console.error("拍照失败详情:", error);
    }
  } 
};

运行后查看控制台的错误信息,这是排查问题最关键的一步。

2. 确认相机权限完全授予

虽然相机窗口能显示,但Android 9+上某些场景下,拍照操作可能需要额外的权限验证。确保你已经通过Expo的Permissions模块请求了相机和相册权限:

import { Permissions } from 'expo';

// 在组件挂载时请求权限
componentDidMount = async () => {
  const { status: cameraStatus } = await Permissions.askAsync(Permissions.CAMERA);
  const { status: rollStatus } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
  if (cameraStatus !== 'granted' || rollStatus !== 'granted') {
    alert('需要授予相机和相册权限才能拍照');
  }
};

注意:Expo SDK v35的Permissions模块依赖expo-permissions,确保你已经安装该依赖。

3. 调整takePictureAsync的配置参数

部分Android设备对默认的拍照配置兼容性不好,尝试传入更明确的参数:

let photo = await this.camera.takePictureAsync({
  quality: 0.5, // 降低图片质量,减少设备处理压力
  base64: false, // 不需要base64编码的话关闭,节省资源
  skipProcessing: false, // 让Expo统一处理图片,避免设备原生逻辑冲突
});

4. 升级Expo SDK版本

你使用的v35.0.0版本比较老旧,存在不少Android 9+的兼容性bug。建议升级到较新的稳定版本(比如v49或v50),Expo后续版本修复了大量相机相关的真机适配问题。

5. 检查设备相机状态

确保你的Android真机的系统相机能正常工作,没有被其他应用占用,也没有硬件故障。有时候系统层面的相机异常会导致Expo的Camera组件无法完成拍照流程。

如果以上方法都没解决,把try-catch捕获到的错误信息贴出来,能更精准地定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:51