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
相关产品推荐
相关产品推荐

