У меня следующая проблема: у меня есть приложение Flutter, которое использует Geolocator для определения местоположения пользователей. Приложение прекрасно работает с параметром «Точное местоположение», но при выборе «Приблизительное местоположение» возникает ошибка: «java.lang.SecurityException: ни у пользователя 10166, ни у текущего процесса нет android.permission.ACCESS_FINE_LOCATION». затем приложение закрывается само.
Когда я захожу в настройки устройства-эмулятора Android и меняю разрешения на местоположение с «Спрашивать каждый раз» на «Разрешить только при использовании приложения», проблема не воспроизводится, но это не то поведение, которое я хотел бы, чтобы пользователи испытывали — я хочу, чтобы они чтобы увидеть диалоговое окно Android, в котором их спрашивает, разрешают ли они использовать свое местоположение, и выбрать между «Точным» и «Приблизительным местоположением».
Есть ли у вас какие-либо идеи? Я использую флаттер 3.19.6 и геолокатор 12.0.0.
Я пробовал несколько вещей, например добавление android.permission.ACCESS_FINE_LOCATION и android.permission.ACCESS_COARSE_LOCATION в файлы AndroidManifest, но это не помогло. Более того, я запросил разрешения во время выполнения, но это не решило проблему. Это код:
Future<void> getCurrrentUserLocation() async {
bool serviceEnabled;
LocationPermission permission;
// Check if location services are enabled.
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
print('Location services are disabled.');
return;
}
// Check the current permission status.
//permission = await Geolocator.requestPermission();
permission = await Geolocator.checkPermission();
print('Initial permission status: $permission');
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
print('Permission after request: $permission');
if (permission == LocationPermission.denied) {
print('Location permissions are denied.');
return;
}
}
if (permission == LocationPermission.deniedForever) {
print('Location permissions are permanently denied, we cannot request permissions.');
return;
}
if (permission == LocationPermission.whileInUse || permission == LocationPermission.always) {
try {
Position position = await Geolocator.getCurrentPosition(timeLimit: const Duration(seconds: 15));
print('Latitude: ${position.latitude}, Longitude: ${position.longitude}');
} catch (e) {
print('Error occurred while trying to get location: $e');
}
} else {
print('Location permissions are not granted.');
}
В файле android/app/build.gradle убедитесь, что compileVersion равен
скомпилироватьSdkVersion 34.
Кроме того, добавьте следующие разрешения в свой AndroidManifest.xml:
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name = "android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" />
Проблема возникает из последней версии геолокатора 12.0.0. Ошибка и исправление с понижением версии описаны здесь: https://github.com/Baseflow/flutter-geolocator/issues/1515
Эти изменения не решили проблему.