在模块 ExpoPermissions 上执行导出的方法 askAsync 时发生异常:null



我在使用 ExpoPermission 界面时遇到错误。我刚刚开始使用React和Expo学习Android开发,按照指南创建了一个新项目

npm install -g create-react-native-app 
create-react-native-app my-app 
cd my-app/ 
npm start

一切正常,并且该示例在我的手机上运行,然后我只是添加了一个简单的按钮,该按钮从博览会文档中调用该示例,但是当我按下它时它会启动此消息。

[Error: Encountered an exception while calling native method: Exception occurred while executing exported method askAsync on module ExpoPermissions: null]

我的代码很简单,只是添加到视图中

<TouchableOpacity onPress={handlePressMe} style={styles.helpLink}>
<Text style={styles.LinkBlue}>
Press me!
</Text>
</TouchableOpacity>

然后添加了代码:

function handlePressMe() {
request_storage_runtime_permission();
}
async function request_storage_runtime_permission() {
try {
const granted = await Permissions.askAsync(Permissions.WRITE_EXTERNAL_STORAGE);
print(granted)
Alert.alert("Storage Permission received.");
/*if (granted === PermissionsAndroid.RESULTS.GRANTED) {
Alert.alert("Storage Permission Granted.");
}
else {
Alert.alert("Storage Permission Not Granted");
}*/
} catch (err) {
console.warn(err)
}
}

import * as Permissions from 'expo-permissions';

我已经阅读了 Expo 的文档,发现许多安装都说要为这个库做,但没有一个改变任何东西,以防万一,我添加的两件事

sudo expo install expo-permissions
sudo yarn add react-native-unimodules

还要注意的是,我添加了对 app.json 的权限,并尝试使用 getAsync 查看它是否已被授予,但启动了相同的错误,这是我的 app.json:

{
"expo": {
"name": "Test App",
"slug": "testApp",
"privacy": "public",
"sdkVersion": "35.0.0",
"platforms": [
"android",
"web"
],
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"splash": {
"image": "./assets/images/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"updates": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": [
"**/*"
],
"android": {
"permissions": [
"WRITE_EXTERNAL_STORAGE"
]
}
}
}

尝试搜索更多信息,但我发现的唯一内容是未回答的主题。有谁知道问题是什么,或者如何提示更多信息?它唯一显示的是空。

在尝试直接使用 React Native 执行此操作后,我在这里发现了问题:

Expo 使用它自己的方式来命名权限,因此如果您想请求WRITE_EXTERNAL_STORAGE,而在 RN 上,您会完全调用此权限,而在 Expo 上,您需要请求CAMERA_ROLL权限,其中包括写入和读取权限。错误消息并不直观,因为它只标记 null,同时试图说您正在发送 null 作为参数,因为 您请求的权限 (Permissions.WRITE_EXTERNAL_STORAGE( 返回 null。所以解决方案是将其更改为:

const granted = await Permissions.askAsync(Permissions.CAMERA_ROLL);

希望这对未来的某人有所帮助。

最新更新