React Native expo-permission 已弃用,现在用什么?

问题描述 投票:0回答:5

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

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

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

上述方法有效,但不断发出警告,表示不推荐使用博览会权限。

如果我使用:

import {Location, Permissions } from 'expo';

它说无法读取未定义的属性“askAsync”。

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

谢谢!

react-native permissions location expo
5个回答
19
投票

正如Brent Vatne博客所说,

expo-permissions 已被弃用,取而代之的是

module-specific permissions methods
您应该不再使用
Permissions.askAsync
Permissions.getAsync
权限 需要权限的模块导出的方法。

例如:您应该将调用替换为

Permissions.askAsync(Permissions.CAMERA)
Camera.requestPermissionsAsync()

在一个 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;
}

6
投票

如果有人来到这里并想要获得

ImagePicker
的权限,那么根据 docs 你应该这样做:

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();

文档


2
投票

作品:

import { Camera } from 'expo-camera';
import * as ImagePicker from "expo-image-picker";

const resultPermision = await Camera.requestCameraPermissionsAsync();
const resultPermisionCamera = resultPermision.status;

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" });
};
© www.soinside.com 2019 - 2024. All rights reserved.