React-Native / Expo位置状态(如果用户在授予应用权限后不想允许位置)

时间:2020-01-23 07:04:13

标签: react-native geolocation expo

在react native应用中允许访问GPS后。如果用户拒绝打开gps。它将显示类似

的错误

未处理的承诺拒绝:错误:由于设备设置不满意,位置请求失败。”

我想避免用户拒绝Gps打开选项,它将返回一些信息。所以我需要该位置的“如果”条件是“开”还是“关”。 (我正在使用expo-location)

3 个答案:

答案 0 :(得分:2)

您将需要检查来自expo-location的状态并将用户重定向到设置,以允许您针对Android使用android Intent的权限,对于iOS您可以使用Linking将用户重定向至设备设置并授予权限< / p>

  requestLocationPermission = async () => {
    const { status } = await Permissions.askAsync(Permissions.LOCATION);    
    if (status === 'granted) {
      navigation.navigate('screen_name');
    } else {
      // Alert Message if user does not allow permissions
      Alert.alert("alert Message", "Instructions based on OS", [
        {
          text: 'Open Settings',
          onPress: () => goToSettings(),
          style: 'cancel',
        },
        { text: Languages.DENY, onPress: () => navigation.goback()},
      ]);
    }
  };

转到设置

  goToSettings = () => {
    if (Platform.OS == 'ios') {
      // Linking for iOS
      Linking.openURL('app-settings:');
    } else {
      // IntentLauncher for Android
      IntentLauncher.startActivityAsync(
        IntentLauncher.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS
      );
    }
  };

  • 注意Intent启动器是适用于Android的单独软件包

答案 1 :(得分:2)

您看到此错误,因为Location.getCurrentPositionAsyncasync方法,它返回一个promise,如果失败,则会抛出一个错误(您所看到的错误)。

您可以将代码包装在trycatch块中,以捕获错误并对此进行处理。 示例:

_getLocationAsync = async () => {
    let { status } = await Permissions.askAsync(Permissions.LOCATION);
    if (status !== 'granted') {
      alert('The request was denied');
    }else{
      try{
        let location = await Location.getCurrentPositionAsync({});
        // do something with location
      }catch(e){
        alert('We could not find your position. Please make sure your location service provider is on');
        console.log('Error while trying to get location: ', e);
      }
    }
  }

// call this._getLocationAsync();

答案 2 :(得分:0)

使用它来打开 GPS:

Location.enableNetworkProviderAsync()

这是一个简单的弹出窗口。 (无需重定向到设置)