Flutter-geolocator: Falha na permissão negada

Criado em 13 dez. 2018  ·  7Comentários  ·  Fonte: Baseflow/flutter-geolocator

🐛 Relatório de Bug

Ao permitir a permissão de localização, está funcionando bem, mas ao negar a permissão de localização, estou recebendo a seguinte mensagem de erro.

Erro de dardo: exceção não tratada:
PlatformException (PERMISSION_DENIED, acesso aos dados de localização negado, nulo)

0 Geolocator._handleInvalidPermissions (pacote: geolocator / geolocator.dart: 197: 7)

1 Geolocator.getCurrentPosition (pacote: geolocator / geolocator.dart: 106: 7)

2 SignupScreenPageState._submitAction (pacote: locum_mate / Screens / signup.dart: 126: 10)

3 SignupScreenPageState.buildWidget..(pacote: locum_mate / Screens / signup.dart: 261: 31)

4 _InkResponseState._handleTap (pacote: flutter / src / material / ink_well.dart: 507: 14)

5 _InkResponseState.build.(pacote: flutter / src / material / ink_well.dart: 562: 30)

6 GestureRecognizer.invokeCallback (pacote: flutter / src / gestures / reconhecizer.dart: 102: 24)

7 TapGestureRecognizer._checkUp (pacote: flutter / src / gestures / tap.dart: 242: 9)

8 TapGestureRecognizer.handlePrimaryPointer ( pacote: flutter <…>

Comportamento esperado

O comportamento esperado deve me dar uma resposta nula, para que possamos prosseguir.

Etapas de reprodução

Importar pub em pubspec.yaml

Escreva o seguinte código para qualquer evento de toque de botão
Experimente {
Posição posição = espera geolocator ()
.getCurrentPosition (desejadoAccuracy: LocationAccuracy.high);
} catch (e) {
imprimir (e);
}

você terá um erro.

Configuração

Versão: 1.0.1

[✓] Flutter (Canal mestre, v1.0.1-pre.2, no Mac OS X 10.14 18A384a, local en-GB)
[✓] Conjunto de ferramentas Android - desenvolver para dispositivos Android (Android SDK 28.0.3)
[✓] conjunto de ferramentas iOS - desenvolver para dispositivos iOS (Xcode 10.1)
[✓] Android Studio (versão 3.2)
[✓] Código VS (versão 1.29.1)
[✓] Dispositivo conectado (1 disponível)

• Nenhum problema encontrado!

Plataforma:

  • [x]: iphone: iOS
  • []: robô: Android

Comentários muito úteis

@YogeshLegendkiller , @kaumudpa , a solução fornecida por @jaumard é a forma sugerida de resolver este problema.

Outra abordagem seria usar o método checkGeolocationPermissionStatus e certificar-se de que o status está definido como PermissionStatus.granted antes de chamar getCurrentPosition , getLastKnownPosition ou getPositionStream métodos. No entanto, isso significaria que você precisa tomar cuidado ao solicitar permissões você mesmo. Por exemplo:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

Todos 7 comentários

Você já resolveu como lidar com isso

Alguma solução alternativa para isso?

@YogeshLegendkiller @kaumudpa se quiser uma solução alternativa, tente capturar a chamada e retornar null em PlatformException.

@YogeshLegendkiller , @kaumudpa , a solução fornecida por @jaumard é a forma sugerida de resolver este problema.

Outra abordagem seria usar o método checkGeolocationPermissionStatus e certificar-se de que o status está definido como PermissionStatus.granted antes de chamar getCurrentPosition , getLastKnownPosition ou getPositionStream métodos. No entanto, isso significaria que você precisa tomar cuidado ao solicitar permissões você mesmo. Por exemplo:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

Como pedir permissão?

@ abdullah4one Você pode usar permission_handler e pedir permissão como esta:

import 'package:permission_handler/permission_handler.dart';

Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.location]);

Pode ser tarde para responder, mas eu também estava enfrentando o mesmo problema em que o aplicativo não estava pedindo permissão no iOS e estava funcionando perfeitamente bem no Android.

Como não foi solicitada a permissão, é por isso que o código de permissão não estava funcionando para iOS. Eu encontrei um pacote chamado "location_permissions" que pode ser usado para pedir permissão manualmente.

Os passos a seguir são os seguintes

  1. Adicione "location_permissions: 3.0.0 + 1" a estas dependências em "pubspec.yaml". Observe que fiz isso para o flutter 1.22.0, portanto, para o flutter 2.0, isso pode ser um problema.
  2. Importar o pacote no arquivo

    import ' package: location_permissions / location_permissions.dart ';

  3. Adicione o seguinte código na página onde deseja pedir permissão. (Melhor adicionar isso na primeira página do seu aplicativo.)

     <strong i="16">@override</strong>
      void initState() {
       ....
      if (Platform.isIOS) {
        location_permission();
      }
      ....
    

    }

  4. Adicione os dois métodos a seguir no mesmo arquivo

    void location_permission () async {
    permissão final PermissionStatus = await _getLocationPermission ();
    if (permission == PermissionStatus.granted) {
    posição final = espera geolocator.getCurrentPosition (
    desejadoAccuracy: LocationAccuracy.best);

      // Use the position to do whatever...
    }
    

    }

    Futuro_getLocationPermission () async {
    permissão final de PermissionStatus = espera LocationPermissions ()
    .checkPermissionStatus (nível: LocationPermissionLevel.location);

    if (permission != PermissionStatus.granted) {
      final PermissionStatus permissionStatus = await LocationPermissions()
          .requestPermissions(
              permissionLevel: LocationPermissionLevel.location);
    
      return permissionStatus;
    } else {
      return permission;
    }
    

    }

É isso agora você deve obter um pop-up no aplicativo iOS que pedirá a permissão de localização.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

hectorAguero picture hectorAguero  ·  5Comentários

prasant10050 picture prasant10050  ·  6Comentários

fawadkhanucp picture fawadkhanucp  ·  3Comentários

deisold picture deisold  ·  3Comentários

jaumard picture jaumard  ·  3Comentários