Reputation: 423
In IOS there isn't a problem while looking for gps coords. It works fine.
On Android side its not stable as IOS. This problem both in real device and emulator. Sometimes it can find location, but sometimes not. Looking for 3days but there wasn't find a solution.
When my app cannot find my location, I tried via Google Maps app, it works like charm.
Here is my code for both IOS and Android;
getCurrentPosition() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({ initialPosition: position });
alert(JSON.stringify(position))
var coords = new Coords();
coords.Latitude = position.coords.latitude;
coords.Longitude = position.coords.longitude;
this.getPharmaciesByCoordinates(coords);
},
(error) => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
);
this.watchID = navigator.geolocation.watchPosition((position) => {
this.setState({ initialPosition: position });
},
(error) => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
);
}
Any kind of solution is welcome.
Thanks
Upvotes: 30
Views: 46248
Reputation: 69
Removing timeout and maximumAge did solve the issue on android on my end
Upvotes: 3
Reputation: 1864
You might want to check if your android emulator GPS is enabled or not.
Go to options ( "⋮" on emulator) --> Location --> Enable GPS signal should be enabled.
Upvotes: 0
Reputation: 2431
For those who still facing the issue, be aware of the params. I used to leave params to defaults but when it comes to enableHighAccuracy, you should be careful because when you set this to false, that means you are requesting WIFI location else GPS location. If you don't set this true, you will probably receive error on emulators as I did.
Supported options:timeout (ms) - Is a positive value representing the maximum length of time (in milliseconds) the device is allowed to take in order to return a position. Defaults to INFINITY.
maximumAge (ms) - Is a positive value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to Infinity the device will always return a cached position regardless of its age. Defaults to INFINITY.
enableHighAccuracy (bool) - Is a boolean representing if to use GPS or not. If set to true, a GPS position will be requested. If set to false, a WIFI location will be requested.
Edit 1; I recommend you all to use this library instead of native one (react-native-geolocation-service) as its created for such timeout issues.
Upvotes: 6
Reputation: 5143
I suggest to 2 ways to consider dealing with it:
Here is how I've implemented number 2:
import Geolocation from "@react-native-community/geolocation";
const getCurrentLocation = (resolve, enableHighAccuracy, onError) => {
console.log(`[getCurrentPosition] enableHighAccuracy=${enableHighAccuracy.toString()}`);
Geolocation.getCurrentPosition(
(position) => {
const location = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
console.log('[getCurrentPosition] success');
resolve(location);
},
onError,
{enableHighAccuracy, timeout: 20000}
);
};
/**
* We first try to get location with enableHighAccuracy=true (try to get position via GPS) if it fails try to get it with enableHighAccuracy=false (try to get position from wifi)
* @return {Promise}
*/
export const getCurrentPosition = () => {
return new Promise((resolve) => {
getCurrentLocation(resolve, true,
(error1) => {
// failed to retrieve with enableHighAccuracy=true - now try with enableHighAccuracy=false
console.log(`[getCurrentPosition] failed 1st time trying again with enableHighAccuracy=false, error: ${error1.message}`);
getCurrentLocation(resolve, false, (error2) => {
// Could not retrieve location - we can live with that
console.log(`[getCurrentPosition] failed ${error2.message}`);
resolve();
})
});
});
}
Upvotes: 0
Reputation: 1076
Remove Param 'maximumAge' & Just Keep
{ enableHighAccuracy: true, timeout: 2000}
Upvotes: 2
Reputation: 69
In my case it worked fine after removing timeout and maximumAge
and setting enableHighAccuracy
to false
.
Upvotes: 1
Reputation: 173
import Geolocation from '@react-native-community/geolocation';
Geolocation.getCurrentPosition(
position => {
const initialPosition = JSON.stringify(position);
console.log(initialPosition);
},
error => Alert.alert('Error', JSON.stringify(error)),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000},
);
This function work for me and I have change the "AndroidManifest.xml" file with the
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Upvotes: 8
Reputation: 540
Hi I was facing same issue "request time out ". I have tried every possible solution which I found but, those could not work for me but recently I found one module which overcomes this problem. react-native-geolocation-service This worked for me .....
Upvotes: 6
Reputation: 11244
Working { enableHighAccuracy: false, timeout: 5000, maximumAge: 10000 },
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Add Permission in P list and android Manifest also
import React, { Component } from 'react';
import { View, Text } from 'react-native';
export default class App extends Component {
constructor(props) {
super(props);
this.state = {
latitude: null,
longitude: null,
error: null,
};
}
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
latitude: position.coords.latitude,
longitude: position.coords.longitude,
error: null,
});
},
(error) => this.setState({ error: error.message }),
{ enableHighAccuracy: false, timeout: 5000, maximumAge: 10000 },
// { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 },
);
}
render() {
return (
<View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Latitude: {this.state.latitude}</Text>
<Text>Longitude: {this.state.longitude}</Text>
{this.state.error ? <Text>Error: {this.state.error}</Text> : null}
</View>
);
}
}
Upvotes: -1
Reputation: 2284
I tried various methods and npm modules. Finally I got solved this issue by using this module. I strongly suggest this. https://www.npmjs.com/package/react-native-geolocation-service
Upvotes: 1
Reputation: 2607
I have done the app by location request. The command
{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 },
will work on iOS but not in Android. I think you should check Platform.
navigator.geolocation.getCurrentPosition(
(location) => {
console.log('location ', location);
if (this.validLocation(location.coords)) {
this.locationToAddress(location.coords);
}
},
(error) => {
console.log('request location error', error);
},
Platform.OS === 'android' ? {} : { enableHighAccuracy: true, timeout: 20000, maximumAge: 10000 }
);
Upvotes: 0
Reputation: 2249
the tricks is, if you set
{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 }
then it will work. full code below.
import React, { Component } from 'react';
import { View, Text } from 'react-native';
class GeolocationExample extends Component {
constructor(props) {
super(props);
this.state = {
latitude: null,
longitude: null,
error: null,
};
}
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
latitude: position.coords.latitude,
longitude: position.coords.longitude,
error: null,
});
},
(error) => this.setState({ error: error.message }),
{ enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000 },
);}
render() {
return (
<View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Latitude: {this.state.latitude}</Text>
<Text>Longitude: {this.state.longitude}</Text>
{this.state.error ? <Text>Error: {this.state.error}</Text> : null}
</View>
);
}
}
export default GeolocationExample;
Upvotes: -5
Reputation: 1041
It's possible that you are inside of the building or office and your signal is not that good. I've tried with many configuration and this one fit the best for me:
{
enableHighAccuracy: false,
timeout: 5000,
maximumAge: 10000
}
Or try increasing timeout. Because for me the usual 2000ms wasn't working, I kept getting "Location request timed out". So disable high accuracy, increase timeout and you're good to go.
Upvotes: 20
Reputation: 423
I found a solution via external lib that uses native LocationManager
. It uses play services location and emitting location event as I want.
Here is the library; https://bitbucket.org/timhagn/react-native-google-locations#readme
And when compiling for android, don't forget to include android/app/build.gradle
dependencies {
...
compile "com.google.android.gms:play-services:10.0.1" -> which version that you have write down here.
...
}
And finally don't forget to download Google Play Services
and Google Support Library
in Android SDK Manager you can find your play services versions into;
<android-sdk-location>/<sdk-version>/extras/google/m2repository/com/google/android/gms/play-services
Upvotes: 2