React Native GeoLocation不适用于Android

时间:2017-03-11 07:57:03

标签: android react-native

任何人都可以确认React Native Geolocation是否真的在Android上运行? 我在使用getCurrentPosition()方法时遇到位置请求超时,并且在使用watchPosition()方法时没有错误消息。

我已在AndroidManifest.xml上添加了所需的权限(FINE LOCATION),并且该应用允许位置权限。

这是我的实施:

componentWillMount() {
 navigator.geolocation.getCurrentPosition((position) => {
        console.log('+++++++');
        console.log(position.coords.longitude);
        this.setState({
          longitude: position.coords.longitude,
          error: null,
        });
      },
      (error) => {
        console.log(error);

      },

    );
}

React Native Version:0.42

8 个答案:

答案 0 :(得分:1)

实施上述所有答案后 我不得不重启我的新手机然后开始工作

答案 1 :(得分:0)

是的,位置在我们针对Android的React Native应用程序中完美运行。

首先,getCurrentPosition(..)不会返回watchId。您应该使用watchPosition(..)。检查您的设备是否启用了位置服务,如果您在模拟器中对其进行了测试,则表明您已在模拟器设置中设置了位置。另请注意:在Android M及更高版本上,您还需要使用PermissionsAndroid.check(...)PermissionsAndroid.request(...) API调用来请求权限。

答案 2 :(得分:0)

不要引用position对象,而只需处理coords对象。

 navigator.geolocation.getCurrentPosition(
      ({coords}) => {
        const {latitude, longitude} = coords
        this.setState({
          position: {
            latitude,
            longitude,
          },
          region: {
            latitude,
            longitude,
            latitudeDelta: 0.001,
            longitudeDelta: 0.001,
          }
        })
      },
      (error) => alert(JSON.stringify(error)),
      // 'enableHighAccuracy' sometimes causes problems
      // If it does, just remove it.
      {enableHighAccuracy: true} 
    )

答案 3 :(得分:0)

您需要将enableHighAccuracy更改为false

const LATITUDE_DELTA = 0.0922;
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO; 

this.state = {
        region:{}}

 navigator.geolocation.getCurrentPosition(
                (position) => {
                    console.log(position);
                    this.setState({
                        region: {
                            longitude: position.coords.longitude,
                            latitude: position.coords.latitude,
                            latitudeDelta: LATITUDE_DELTA,
                            longitudeDelta: LONGITUDE_DELTA
                        }
                    });
                },
                (error) => console.log(new Date(), error),
                {enableHighAccuracy: false, timeout: 10000, maximumAge: 3000}
            );

答案 4 :(得分:0)

我有一个类似的问题,因为我在建筑物里,导致我的设备无法正确捕获gps信号。如果您在封闭的建筑物中,请尝试移至室外。

答案 5 :(得分:0)

我建议获得完美的位置数据是创建2个位置处理程序。

我使用react-native-location作为第一个处理程序

如果无法获取位置,我们将使用本机地理位置的第二个处理程序。

永不失败,兼容性:

  • IOS-所有版本
  • ANDROID-所有上述SDK 20

检查以下示例:

配置

RNLocation.configure({
     distanceFilter: 0.5,
     desiredAccuracy: {
         ios: "best",
         android: "highAccuracy"
     },
     headingOrientation: "portrait",
     // Android ONLY
     androidProvider: "auto",
     interval: 5000, // Milliseconds
     fastestInterval: 10000, // Milliseconds
     maxWaitTime: 5000, // Milliseconds
     // IOS ONLY
     allowsBackgroundLocationUpdates: false,
     headingFilter: 1, // Degrees
     pausesLocationUpdatesAutomatically: false,
     showsBackgroundLocationIndicator: false,
})

功能 getUserLocation

static getUserLocation = async () => {
    let locationSubscription: any = null
    let locationTimeout: any = null
    const options = { enableHighAccuracy: true, timeout: 25000 }
    return new Promise<any>((resolve, reject) => {
        // request permissions using RN Location
        RNLocation.requestPermission({
            ios: "whenInUse",
            android: {
              detail: "fine"
            }
        }).then(granted => {
            console.log("Location Permissions: ", granted)
            // if has permissions try to obtain location with RN location
            if (granted) {
                locationSubscription && locationSubscription()
                locationSubscription = RNLocation.subscribeToLocationUpdates(([locations]: any) => {
                    locationSubscription()
                    locationTimeout && clearTimeout(locationTimeout)
                    console.log("location fetched with RN Geolocation")
                    resolve({ coords: { latitude: locations.latitude, longitude: locations.longitude }})
                })
            } else {
                locationSubscription && locationSubscription()
                locationTimeout && clearTimeout(locationTimeout)
                console.log("no permissions to obtain location")
                resolve(null)
            }

            // if RN Location cant resolve the request use Native Location instead
            locationTimeout = setTimeout(() => {
                navigator.geolocation.getCurrentPosition((locations) => {
                    locationSubscription()
                    locationTimeout && clearTimeout(locationTimeout)
                    console.log("location fetched with Native Geolocation")
                    resolve(locations)
                }, error => {
                    locationSubscription && locationSubscription()
                    locationTimeout && clearTimeout(locationTimeout)
                    console.log("location error", error)
                    resolve(null)
                }, options);
            }, 15000)
        })
    })
}

答案 6 :(得分:0)

cd android gradlew clean

依赖性 “ react-native”:“ 0.62.0”, “ @ react-native-community / geolocation”:“ ^ 2.0.2”,

答案 7 :(得分:-1)

如果您尝试使用此代码,那么我已经在Android OS 8,RN 0.49.5中进行了测试 React Native current location 诀窍是设置

{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 }