Flutter-geolocator: Erreur après approbation sur iOS: PlatformException (PERMISSION_DENIED, Accès aux données de localisation refusé, null)

Créé le 30 avr. 2019  ·  12Commentaires  ·  Source: Baseflow/flutter-geolocator

🐛 Rapport de bogue

  1. 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)

  2. Mais après avoir demandé la position une seconde fois, la position correcte est instantanément renvoyée sans dialogue ni erreur.

Comportement prévisible

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.

Étapes de reproduction

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

}

Configuration

Version Flutter: "Channel dev, v1.5.8"
Version du géolocalisateur: ^ 4.0.2

Plate-forme:

  • [x]: iPhone: iOS
  • []: robot: Android
ios triage bug

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.

Tous les 12 commentaires

@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):
image

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:
image

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

  1. Ajoutez "location_permissions: 3.0.0 + 1" ces dépendances dans "pubspec.yaml". Veuillez noter que j'ai fait cela pour flutter 1.22.0 donc pour flutter 2.0 cela pourrait être un problème.
  2. Importez le package dans le fichier

    import ' package: location_permissions / location_permissions.dart ';

  3. 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();
      }
      ....
    

    }

  4. 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_getLocationPermission () async {
    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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

long1eu picture long1eu  ·  4Commentaires

lqmminh picture lqmminh  ·  6Commentaires

jaumard picture jaumard  ·  3Commentaires

deisold picture deisold  ·  3Commentaires

dark-chocolate picture dark-chocolate  ·  3Commentaires