Le code demande la position, l'utilisateur approuve, le code génère une erreur:
PlatformException (PERMISSION_DENIED, Accès aux données de localisation refusé, null)
Mais après avoir demandé la position une seconde fois, la position correcte est instantanément renvoyée sans dialogue ni erreur.
La position est renvoyée et aucune erreur n'est générée lors de la demande de position et de l'approbation de l'utilisateur.
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
}
Version Flutter: "Channel dev, v1.5.8"
Version du géolocalisateur: ^ 4.0.2
Plate-forme:
@FlashJonas récemment, nous avons complètement geolocator
(version 5.0.0) et je me demandais si vous rencontriez toujours ce problème dans la dernière version?
@mvanbeusekom Je confirme que le problème existe toujours dans la version 5.0.0
vient de découvrir votre package grâce aux cours AppBrewery.
J'ai décidé de suivre la documentation des packages et j'ai ajouté à mon fichier plist les 3 clés:
<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>
Premier appel à
Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
demander l'autorisation à l'utilisateur (avec 3 choix):
Si j'appuie sur "uniquement lors de l'utilisation de l'application", le terminal enregistre les informations suivantes:
[VERBOSE-2: ui_dart_state.cc (148)] Exception non gérée: PlatformException (PERMISSION_DENIED, Accès aux données de localisation refusé, null)
0 Geolocator._handleInvalidPermissions (package: geolocator / geolocator.dart: 191: 7)
1 Geolocator.getCurrentPosition (package: geolocator / geolocator.dart: 102: 7)
2 _LoadingScreenState.getLocation (paquet: clima / screens / loading_screen.dart: 13: 10)
3 _LoadingScreenState.build.
(paquet: clima / screens / loading_screen.dart: 23: 13) 4 _InkResponseState._handleTap (package: flutter / src / material / ink_well.dart: 511: 14)
5 _InkResponseState.build.
(paquet: flutter / src / material / ink_well.dart: 566: 30) 6 GestureRecognizer.invokeCallback (paquet: flutter / src / gestures / Recognizer.dart: 166: 24)
7 TapGestureRecognizer._checkUp (package: flutter / src / gestures / tap.dart: 240: 9)
8 TapGestureRecognizer.handlePrimaryPointer (package: flutter / src / gestures / tap.dart: 177: 9)
9 <…>
La deuxième pression est correcte et la position est enregistrée sans problème:
battement: Lat: 37.785834, Long: -122.406417
Code:
J'ai toujours le même problème sur mon iPhone 5s, 12.2, en utilisant le géolocalisateur 5.1.2.
* modifier (Flutter Channel dev, 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
}
}
Journaux de l'exécution du code ci-dessus:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy
Je suis confronté à la même erreur:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(L'autorisation de localisation est accordée)
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)
J'ai eu la même erreur lors de l'utilisation des trois chaînes d'autorisation. Si j'utilise uniquement NSLocationWhenInUseUsageDescription, l'application fonctionne à nouveau. Ma meilleure hypothèse est que lorsque vous utilisez les trois autorisations, l'application est démarrée et demande l'emplacement avant que l'utilisateur ne soit invité à le confirmer. Le comportement de l'interface utilisateur semble le confirmer, mais ce n'est qu'une supposition. Quoi qu'il en soit, si vous pouvez vivre uniquement avec NSLocationWhenInUseUsageDescription, supprimez les deux autres.
même problème :( sur la dernière version du canal stable de flutter.
ce paquet est nul ...
Même erreur, dernière version de Flutter sur Android 10.
J'ai le même problème!
Je me demande si ce problème va être résolu, je vois qu'il y a plus d'un an et que les gens y font toujours face. Récemment, j'ai commencé à apprendre Flutter et je suis tombé sur le même problème, avec exactement les mêmes étapes à reproduire.
Lorsque je sélectionne l'option "Uniquement lors de l'utilisation de l'application" dans l'invite iOS, j'obtiens une exception dans la console de flutter, même la deuxième fois que je demande l'emplacement à l'application, j'obtiens les données de localisation correctes.
PS utilisant la dernière version 5.3.2+2
Je travaille actuellement sur un correctif pour cela et une liste d'autres problèmes (voir # 430, pour plus de détails). Ce sera cependant une mise à jour majeure.
Actuellement, le côté iOS est prêt et fonctionnera du côté Android maintenant.
Cela devrait être corrigé dans la version 6.0.0
Il était peut-être tard pour répondre, mais j'étais également confronté au même problème: l'application ne demandait pas d'autorisation dans iOS et fonctionnait parfaitement sous Android.
Parce qu'il n'a pas été demandé d'autorisation, c'est pourquoi le code d'autorisation ne fonctionnait pas pour iOS. J'ai trouvé un paquet nommé "location_permissions" qui peut être utilisé pour demander la permission manuellement.
Les étapes à suivre sont les suivantes
Importez le package dans le fichier
import ' package: location_permissions / location_permissions.dart ';
Ajoutez le code suivant sur la page sur laquelle vous souhaitez demander l'autorisation. (Mieux vaut ajouter cela sur la toute première page de votre application.)
<strong i="16">@override</strong>
void initState() {
....
if (Platform.isIOS) {
location_permission();
}
....
}
Ajoutez les deux méthodes suivantes dans le même fichier
void location_permission () async {
autorisation finale PermissionStatus = attendre _getLocationPermission ();
if (permission == PermissionStatus.granted) {
position finale = attendre geolocator.getCurrentPosition (
souhaitéAccuracy: LocationAccuracy.best);
// Use the position to do whatever...
}
}
Futur
autorisation finale PermissionStatus = attendre LocationPermissions ()
.checkPermissionStatus (niveau: LocationPermissionLevel.location);
if (permission != PermissionStatus.granted) {
final PermissionStatus permissionStatus = await LocationPermissions()
.requestPermissions(
permissionLevel: LocationPermissionLevel.location);
return permissionStatus;
} else {
return permission;
}
}
Voilà maintenant, vous devriez obtenir une fenêtre contextuelle dans l'application iOS qui vous demandera l'autorisation de localisation.
Commentaire le plus utile
Je travaille actuellement sur un correctif pour cela et une liste d'autres problèmes (voir # 430, pour plus de détails). Ce sera cependant une mise à jour majeure.
Actuellement, le côté iOS est prêt et fonctionnera du côté Android maintenant.