Код запрашивает позицию, пользователь утверждает, код выдает ошибку:
PlatformException (PERMISSION_DENIED, доступ к данным о местоположении запрещен, null)
Но после запроса позиции во второй раз правильная позиция немедленно возвращается без диалога или ошибок.
Позиция возвращается, и при запросе позиции и утверждения пользователя ошибки не выдаются.
import 'package:geolocator/geolocator.dart';
try{
position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
}
catch(error)
{
print("error in geolocation: $error"); //error in geolocation: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
print("position: $position"); // position: null
print("retrying"); // retrying
try{
position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
}
catch(error)
{
await printGeoStatus(5);
print("2nd error in geolocation $error");
}
print("final position: $position"); //flutter: final position: Lat: 59.xyz, Long: 17.xyz
}
Версия Flutter: "Channel dev, v1.5.8"
Версия геолокатора: ^ 4.0.2
Платформа:
@FlashJonas недавно мы полностью реорганизовали плагин geolocator
(версия 5.0.0), и мне было интересно, возникла ли у вас эта проблема в последней версии?
@mvanbeusekom Я подтверждаю, что проблема все еще существует в 5.0.0
только что обнаружил ваш пакет на курсах AppBrewery.
Я решил следовать документации пакетов и добавил в свой файл plist 3 ключа:
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location when in the background.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs access to location when open and in the background.</string>
Первый звонок
Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
запрашивать у пользователя разрешение (с 3 вариантами):
Если я нажимаю «только при использовании приложения», терминал регистрирует следующее:
[VERBOSE-2: ui_dart_state.cc (148)] Необработанное исключение: PlatformException (PERMISSION_DENIED, доступ к данным о местоположении запрещен, null)
0 Geolocator._handleInvalidPermissions (пакет: geolocator / geolocator.dart: 191: 7)
1 Geolocator.getCurrentPosition (пакет: geolocator / geolocator.dart: 102: 7)
2 _LoadingScreenState.getLocation (пакет: clima / screen / loading_screen.dart: 13: 10)
3 _LoadingScreenState.build.
(пакет: clima / screen / loading_screen.dart: 23:13) 4 _InkResponseState._handleTap (пакет: flutter / src / material / ink_well.dart: 511: 14)
5 _InkResponseState.build.
(пакет: flutter / src / material / ink_well.dart: 566: 30) 6 GestureRecognizer.invokeCallback (пакет: flutter / src / gestures / распознаватель.dart: 166: 24)
7 TapGestureRecognizer._checkUp (пакет: flutter / src / gestures / tap.dart: 240: 9)
8 TapGestureRecognizer.handlePrimaryPointer (пакет: flutter / src / gestures / tap.dart: 177: 9)
9 <…>
Второе нажатие нормально, и позиция регистрируется без проблем:
флаттер: широта: 37.785834, долгота: -122.406417
Код:
Все еще есть та же проблема на моем iPhone 5s, 12.2, с использованием геолокатора 5.1.2.
* редактировать (разработчик Flutter Channel, v1.8.4)
// Called after closing welcome alert
Future getFirstLocation() async {
Position position;
try {
position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
} catch (error) {
print("getfirstlocation error 1");
try {
position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
} catch (error) {
print("error in geolocation $error");
}
}
print("getfirstlocation position: $position");
if (position != null) {
// send to database
}
}
Журналы выполнения вышеуказанного кода:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy
У меня такая же ошибка:
Android (Oneplus 2) - Android 8.1.0 - Геолокатор 5.1.2
(Разрешение на местоположение предоставлено)
2019-08-15 16:54:22.606 926-1110/system_process E/InputDispatcher: channel '569829a de.paschke.coffeebreak/de.paschke.coffeebreak.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-08-15 16:54:56.808 14735-14766/? E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
#0 Geolocator._handleInvalidPermissions (package:geolocator/geolocator.dart:207:7)
#1 Geolocator.getLastKnownPosition (package:geolocator/geolocator.dart:146:7)
<asynchronous suspension>
#2 LocationService.getLastKnownLocation (package:coffee_break/services/location_service.dart:24:51)
<asynchronous suspension>
#3 UserStoreBase.checkLastLocation (package:coffee_break/stores/user_store.dart:125:36)
Я получил ту же ошибку при использовании всех трех строк разрешений. Если я использую только NSLocationWhenInUseUsageDescription, приложение снова работает. Я предполагаю, что при использовании всех трех разрешений приложение запускается и запрашивает местоположение, прежде чем пользователя попросят его подтвердить. Поведение пользовательского интерфейса, кажется, подтверждает это, но это всего лишь предположение. В любом случае, если вы можете жить только с NSLocationWhenInUseUsageDescription, удалите два других.
такая же проблема :( на последней версии стабильный канал флаттера.
этот пакет отстой ...
Та же ошибка, последняя версия флаттера на Android 10.
У меня такая же проблема!
Интересно, будет ли решаться эта проблема, я вижу, что ей больше года, и люди все еще сталкиваются с ней. Недавно я начал изучать Flutter и столкнулся с той же проблемой, но повторить ее нужно точно так же.
Когда я выбираю опцию «Только при использовании приложения» в приглашении iOS, я получаю исключение в консоли флаттера, даже если во второй раз, когда я запрашиваю местоположение из приложения, я получаю правильные данные о местоположении.
PS с использованием последней версии 5.3.2+2
В настоящее время я работаю над исправлением этой и ряда других проблем (подробнее см. # 430). Однако это будет серьезное обновление.
На данный момент часть iOS готова и теперь будет работать на стороне Android.
Это должно быть исправлено в версии 6.0.0.
Возможно, было поздно отвечать, но я также столкнулся с той же проблемой, когда приложение не запрашивало разрешение в iOS и отлично работало в Android.
Поскольку у него не спрашивали разрешения, поэтому код разрешения не работал для iOS. Я нашел пакет с именем «location_permissions», который можно использовать для запроса разрешения вручную.
Шаги, которые нужно сделать, следующие
Импортируйте пакет в файл
import ' package: location_permissions / location_permissions.dart ';
Добавьте следующий код на страницу, где вы хотите запросить разрешение. (Лучше добавить это на самой первой странице вашего приложения.)
<strong i="16">@override</strong>
void initState() {
....
if (Platform.isIOS) {
location_permission();
}
....
}
Добавьте следующие два метода в один файл
void location_permission () async {
последнее разрешение PermissionStatus = ожидание _getLocationPermission ();
if (разрешение == PermissionStatus.granted) {
final position = await geolocator.getCurrentPosition (
желаемая точность: LocationAccuracy.best);
// Use the position to do whatever...
}
}
Будущее
последнее разрешение PermissionStatus = ожидание LocationPermissions ()
.checkPermissionStatus (уровень: LocationPermissionLevel.location);
if (permission != PermissionStatus.granted) {
final PermissionStatus permissionStatus = await LocationPermissions()
.requestPermissions(
permissionLevel: LocationPermissionLevel.location);
return permissionStatus;
} else {
return permission;
}
}
Вот и все, теперь вы должны получить всплывающее окно в приложении iOS, которое будет запрашивать разрешение местоположения.
Самый полезный комментарий
В настоящее время я работаю над исправлением этой и ряда других проблем (подробнее см. # 430). Однако это будет серьезное обновление.
На данный момент часть iOS готова и теперь будет работать на стороне Android.