Please provide the following:
- SDK Version: 42
- Platforms(Android/iOS/web/all): Android
- Add the appropriate “Tag” based on what Expo library you have a question on.
I have started noticing that getting the device location on Android has started failing frequently. I noticed this when preparing our next release, which contains no code changes related to location.
I built a standalone Expo app with expo-cli
and wrote this code in App.js
to demonstrate.
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { Button, StyleSheet, View } from 'react-native'
import * as Location from 'expo-location';
const MAX_RETRIES = 50;
const useCurrentLocation = () => {
const resolve = async () => {
const response = await Location.requestForegroundPermissionsAsync();
if (response.status !== 'granted') {
throw new Error('Insufficient location permissions');
}
for (let retryCount = 1; retryCount <= MAX_RETRIES; retryCount += 1) {
try {
const { coords } = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.High,
});
console.log('Success', coords);
break;
} catch (e) {
if (e.message.match(/^Location provider is unavailable./) && retryCount <= MAX_RETRIES) {
console.log(
`Retrying resolving location because location provider is unavailable. (${retryCount} / ${MAX_RETRIES})`
);
} else {
console.error(e);
break;
}
}
}
}
return [ resolve ];
}
export default function App() {
const [ resolve ] = useCurrentLocation();
return (
<View style={styles.container}>
<Button onPress={resolve} title="Get Location" />
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});
Getting the location fails many, many times over, sometimes nearly 40 times. Here’s an example output from my Pixel 5. Obviously we’re interested in a solution that’s better than brute force retrying.
Retrying resolving location because location provider is unavailable. (1 / 50)
Retrying resolving location because location provider is unavailable. (2 / 50)
Retrying resolving location because location provider is unavailable. (3 / 50)
Retrying resolving location because location provider is unavailable. (4 / 50)
Retrying resolving location because location provider is unavailable. (5 / 50)
Retrying resolving location because location provider is unavailable. (6 / 50)
Retrying resolving location because location provider is unavailable. (7 / 50)
Retrying resolving location because location provider is unavailable. (8 / 50)
Retrying resolving location because location provider is unavailable. (9 / 50)
Retrying resolving location because location provider is unavailable. (10 / 50)
Retrying resolving location because location provider is unavailable. (11 / 50)
Retrying resolving location because location provider is unavailable. (12 / 50)
Retrying resolving location because location provider is unavailable. (13 / 50)
Retrying resolving location because location provider is unavailable. (14 / 50)
Retrying resolving location because location provider is unavailable. (15 / 50)
Retrying resolving location because location provider is unavailable. (16 / 50)
Retrying resolving location because location provider is unavailable. (17 / 50)
Retrying resolving location because location provider is unavailable. (18 / 50)
Retrying resolving location because location provider is unavailable. (19 / 50)
Retrying resolving location because location provider is unavailable. (20 / 50)
Retrying resolving location because location provider is unavailable. (21 / 50)
Retrying resolving location because location provider is unavailable. (22 / 50)
Retrying resolving location because location provider is unavailable. (23 / 50)
Retrying resolving location because location provider is unavailable. (24 / 50)
Retrying resolving location because location provider is unavailable. (25 / 50)
Retrying resolving location because location provider is unavailable. (26 / 50)
Retrying resolving location because location provider is unavailable. (27 / 50)
Retrying resolving location because location provider is unavailable. (28 / 50)
Retrying resolving location because location provider is unavailable. (29 / 50)
Retrying resolving location because location provider is unavailable. (30 / 50)
Retrying resolving location because location provider is unavailable. (31 / 50)
Retrying resolving location because location provider is unavailable. (32 / 50)
Retrying resolving location because location provider is unavailable. (33 / 50)
Retrying resolving location because location provider is unavailable. (34 / 50)
Retrying resolving location because location provider is unavailable. (35 / 50)
Success Object {
"accuracy": 11.795999526977539,
"altitude": 21.178509589978393,
"altitudeAccuracy": 3,
"heading": 0,
"latitude": -37.8253594,
"longitude": 145.0111059,
"speed": 0,
}
This issue is also being talked about here, as it seems to have resurfaced unprovoked for a number of people. Seems like about 12 days ago people started seeing this issue.
https://github.com/expo/expo/issues/5504
Thanks