React Native expo-permission已被弃用,现在应该使用什么?

11

我正在使用expo-permission库中的权限来获取用户的位置坐标:

import * as Location from "expo-location";
import * as Permissions from 'expo-permissions';

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

上述方法可以实现功能,但是一直会出现 expo-permissions 已弃用的警告。

如果我使用:

import {Location, Permissions } from 'expo';

显示 Cannot read property 'askAsync' of undefined。

有人知道我应该使用什么吗? 我使用sdk42。

谢谢!

5个回答

18
根据Brent Vatne博客,expo-permissions已被废弃,取而代之的是特定模块权限方法。您应该从使用Permissions.askAsyncPermissions.getAsync迁移到需要权限的模块导出的权限方法。例如:您应该用Camera.requestPermissionsAsync()替换调用Permissions.askAsync(Permissions.CAMERA)。在单个SDK中不应该有两种执行相同操作的方式,因此我们选择了我们首选的方法,并围绕它进行整合。现在,您需要从各自的包中使用Permissions。对于位置信息,请首先安装expo-location
expo install expo-location

然后你可以像这样使用它

import * as Location from 'expo-location';

let { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') {
  console.log('Permission to access location was denied');
  return;
}

我们如何添加一个包需要但没有提供任何RequestXPermissionAsync()函数的权限呢? 我正在尝试使用 wifi p2p lib,我需要不同的权限,例如 ACCESS_COARSE_LOCATIONWRITE_EXTERNAL_STORAGE... - Seba99
根据你提到的包中的文档,在 AndroidManifest.xml 中添加这些权限即可完成工作。 - Kartikey

6

如果有人想获取的权限,根据文档,你应该执行以下操作:

import * as ImagePicker from "expo-image-picker";


  const getPermissionAsync = async () => {
    const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
    if (status !== "granted") {
      alert("...");
    }
  };

2
现在使用expo,每个库都有自己的权限请求方法。
以位置为例:
let { status } = await Location.requestForegroundPermissionsAsync();

文档


1
谢谢,它有效,我点赞了另一个回答,因为它解释得更详细,但你的答案是正确的! - Hans

2

工作内容: 从 'expo-camera' 中导入 {Camera}。 从 'expo-image-picker' 库中导入所有模块。

使用 await Camera.requestCameraPermissionsAsync() 请求相机权限并获取结果。 将结果状态存储在 resultPermisionCamera 中。

    if (resultPermisionCamera === "denied") {
        toastRef.current.show("Gallery permissions are needed");
    } else {
        const result = await ImagePicker.launchImageLibraryAsync({
            allowsEditing: true,
            aspect: [4, 3]
        })

现在,expo-camera的表现很好,但我认为app.json这一方面还有待完善。

您是否仍需要添加以下行?: "permissions": [ "CAMERA", "WRITE_EXTERNAL_STORAGE", "CAMERA_ROLL"

向大家提问:)


1
import { Camera } from "expo-camera";

this.state = {
  hasCameraPermission: null,
  type: Camera.Constants.Type.back,
};
componentDidMount = async () => {
  const { status } = await Camera.requestCameraPermissionsAsync();
  this.setState({ hasCameraPermission: status === "granted" });
};

你的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是否正确。你可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接