【问题标题】:Why location permission pop up not showing in React Native?为什么 React Native 中不显示位置权限?
【发布时间】:2021-07-01 12:23:25
【问题描述】:

我想在 react native 中实现获取当前位置。如果在调用地理定位 API 之前未在手机中激活位置但弹出未显示并且此 PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,{ title: 'Location Access Required', message: 'This App needs to Access your location'},); 在使用 PermissionAndroid 模块请求权限时始终返回“已授予”,我会授予激活位置的权限。

这是我的代码

import { PermissionsAndroid } from 'react-native';
import Geolocation from '@react-native-community/geolocation';

...

componentDidMount(){
    
    const requestLocationPermission = async () => {
      let geoOptions = {
        enableHighAccuracy: true,
        timeout:20000,
        maximumAge: 60*60*24
      }

      try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
          {
            title: 'Location Access Required',
            message: 'This App needs to Access your location',
          },
        );
        console.warn(granted);
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
     Geolocation.getCurrentPosition(this.geoLocationSuccess,this.geoLocationFailure,geoOptions);
        }
      } catch (err) {
        console.warn(err);
      }
    };
    requestLocationPermission();
  } 

我的实现是错误的吗?因为我想在未启用位置服务时显示弹出窗口以让用户启用它

【问题讨论】:

  • 所以你是说状态总是返回granted,即使不是?
  • 是的。当我试图检查变量“granted”的值时,总是返回被授予并且不显示弹出让用户授予权限@Konstantin
  • 您可以进入手机设置以确保此处未授予位置设置吗?因为如果它已经被授予,弹出窗口将不会出现。
  • 这个模块不检查手机上的位置是否活跃?
  • 是的,但是如果它已经被授予,那么它就不会显示弹出窗口,因为不需要那个

标签: react-native


【解决方案1】:

这可能没什么帮助,首先确保除了 react-native-geolocation-service 没有库位置。那么如果没有使用反应钩子。你可以试试下面这个方法。

hasLocationPermission = async () => {
  const hasPermission = await PermissionsAndroid.request(
  PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
);

if (hasPermission === PermissionsAndroid.RESULTS.GRANTED) {
  console.log('lagi req permission');
  return true;
}

const status = await PermissionsAndroid.check(
  PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
);

if (status) {
  console.log('permission diberikan');
  return true;
}

if (status === PermissionsAndroid.RESULTS.DENIED) {
  ToastAndroid.show(
    'Location permission denied by user.',
    ToastAndroid.LONG,
  );
} else if (status === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) {
  ToastAndroid.show(
    'Location permission revoked by user.',
    ToastAndroid.LONG,
  );
}
return false;
};


async componentDidMount() {
  if (await this.hasLocationPermission()) {
  Geolocation.getCurrentPosition(
      position => {
        console.log('posisi ditemukan',position.coords.latitude, position.coords.longitude);
        this.setState({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          error: null,
        });
        this.goToRegion(position.coords.latitude, position.coords.longitude);
      },
      error => {
        Alert.alert(
          'Oopss!',
          error.message,
          [
            {
              text: 'OK',
              onPress: () => console.log('Cancel Pressed'),
            },
          ],
        );
        console.log(error.message);
        this.setState({error: error.message});
      },
      {
        accuracy: {
          android: 'high',
          ios: 'best',
        },
        enableHighAccuracy: true,
        timeout: 15000,
        maximumAge: 10000,
        distanceFilter: 0,
        forceRequestLocation: true,
        forceLocationManager: false,
        showLocationDialog: true,
      },
    );
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2022-11-05
    • 2017-05-23
    • 2022-08-16
    相关资源
    最近更新 更多