React Native应用:未被授权使用位置服务。

5

我目前正在开发一个使用手机地理定位服务的项目。

目前我遇到了一个问题,它显示我的地理定位未被授权。

我已经在互联网上搜索过,有几个人也遇到了同样的问题,但我并没有解决它。

  componentDidMount() {
    const { coordinate } = this.state;

    this.requestCameraPermission();

    this.watchID = navigator.geolocation.watchPosition(
      position => {
        const { routeCoordinates, distanceTravelled } = this.state;
        const { latitude, longitude } = position.coords;

        const newCoordinate = {
          latitude,
          longitude
        };
        console.log({ newCoordinate });

        coordinate.timing(newCoordinate).start();

        this.setState({
          latitude,
          longitude,
          routeCoordinates: routeCoordinates.concat([newCoordinate]),
          distanceTravelled:
            distanceTravelled + this.calcDistance(newCoordinate),
          prevLatLng: newCoordinate
        });
      },
      error => console.log(error),
      {
        enableHighAccuracy: true,
        timeout: 20000,
        maximumAge: 1000,
        distanceFilter: 10
      }
    );
  }

我当前的位置应该出现在屏幕上,但是却显示在地图默认位置:旧金山。当使用函数navigator.geolocation.watchPosition时,会出现以下错误:

"code": "E_LOCATION_UNAUTHORIZED",
"message": "Not authorized to use location services",
"watchId": 1,

我的手机是三星S9,并且定位服务已启用...所以我对目前遇到的问题非常好奇。

5个回答

3

谢谢你的回答,我已经解决了我的问题。 显然,由于某种原因,展会不允许使用我的位置信息,所以我只是强制使用了:

  Location.requestPermissionsAsync();

1
import * as Permissions from 'expo-permissions';

await Permissions.askAsync(Permissions.LOCATION);

如果 requestPermissionsAsync(); 无法正常工作,可以尝试另一种方法。


这个回答只有两天的历史,但似乎你没有查看文档,因为这两件事情都已经改变了。权限正在添加到它们各自的包中,而且在位置方面,我们现在有前台位置和后台位置的单独权限。请检查一下。顺便说一句,我在这里是为了找到这个问题的答案。对我来说,这也是设备特定的,因为在snack.expo.io和我的一个设备上,它可以正常工作,但在另一个设备上却显示错误,并且甚至不提示我就阻止了位置访问。 - Irfan wani
我记得是在使用 Expo 36。 - Jonas

0
我曾经遇到这样的情况,iOS 在不需要在 .ts 代码中显式请求任何权限的情况下正常工作。然而,Android 显示了警告 未获得使用位置服务的授权。 现在的 Permissions 语法略有不同,以下是一个关于 Location 的示例。
if (Platform.OS !== "web") {
  const { status } = await Location.requestForegroundPermissionsAsync();
  
  if (status !== "granted") {
    Alert.alert(
      "Insufficient permissions!",
      "Sorry, we need location permissions to make this work!",
      [{ text: "Okay" }]
    );
    return;
  }
}

(一般而言)请勿在 AndroidManifest.xml 中搞乱任何东西,例如 <uses-permission android:name=...,因为无论什么 Expo 需要的内容都会自动生成。这适用于 Locationciting official docs

"某些 Expo 和 React Native 模块默认包含权限。例如,如果您使用 expo-location,则 ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 两者都被暗示并自动添加到您的应用程序权限中。"


0
如果您正在使用React Native,您可能需要在AndroidManifest.xml文件中添加以下内容:
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

0

如果您正在使用移动设备上的Expo客户端,请确保已启用位置权限。

如果您已经授予权限,请检查您的AndroidManifest.xml文件中是否包含以下内容:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>以获取这些位置信息。


测试时,我应该将其添加到 debug/AndroidManifest.xml 还是 main/AndroidManifest.xml 中?需要同时添加吗? - JCraine

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