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

Expo XDE React Native项目CAMERA_ROLL权限undetermined问题求助

解决Expo iOS模拟器相机胶卷权限报错问题

嘿,我来帮你搞定这个权限问题!结合你遇到的情况,分两部分给你说明:

一、iOS模拟器里手动设置Expo应用权限的方法

iOS模拟器的权限入口和真机不太一样,你可以这么找:

  • 先点击模拟器顶部菜单栏的Hardware → Home,回到模拟器的主屏幕
  • 找到「设置」应用打开,往下滑就能看到你的Expo项目(就是你创建的那个项目名称),点进去就能看到相机胶卷的权限开关了

如果第一次请求权限时没弹出授权弹窗,或者权限状态一直是undetermined,可能是模拟器缓存了旧的权限状态。这时候可以重置模拟器:

  • 关掉模拟器,打开Xcode,点击顶部菜单栏的Window → Devices and Simulators
  • 选中你正在用的模拟器,右键选择Erase All Content and Settings,重置后重新运行你的Expo项目就行

二、你的代码里的两个关键问题

看了你的App.js,有两个地方是导致报错的直接原因:

1. 没有主动请求权限就调用ImagePicker

你现在只调用了Permissions.getAsync()去查权限状态,但没有在权限未确定的时候调用Permissions.askAsync()去请求用户授权。正确的流程应该是:先检查权限,没授权就请求,授权通过后再调用ImagePicker。

2. ImagePicker的参数格式错误

launchImageLibraryAsync里的height和width要求是数字类型,你写的'100px'是字符串,这会导致参数解析失败,也会影响功能正常运行。

修正后的代码示例

我把你的代码改成了更清晰的async/await写法,同时修复了上面的问题:

import React from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
import { Permissions, ImagePicker } from 'expo';

export default class App extends React.Component {
  handleGetImage = async () => {
    try {
      // 先请求相机胶卷权限
      const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
      if (status !== 'granted') {
        console.log('相机胶卷权限未授权,无法获取图片');
        return;
      }

      // 权限通过后,调用图片选择器
      const result = await ImagePicker.launchImageLibraryAsync({
        height: 100, // 改为数字,去掉px字符串
        width: 100,
        base64: true
      });

      if (!result.cancelled) {
        const { base64 } = result;
        console.log('成功获取到图片base64:', base64);
      }
    } catch (e) {
      console.log('获取图片时出错:', e);
    }
  };

  render() {
    return (
      <View style={styles.container}>
        <Text>Open up App.js to start working on your app!</Text>
        <TouchableOpacity onPress={this.handleGetImage}>
          <Text>get image</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

小提示

用async/await替代嵌套的.then()会让代码逻辑更清晰,也更容易排查问题。另外,每次调用图片选择器前都最好检查一下权限状态,避免用户后续在设置里关掉权限导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:51