O código pede a posição, o usuário aprova, o código gera um erro:
PlatformException (PERMISSION_DENIED, acesso aos dados de localização negado, nulo)
Mas depois de solicitar a posição uma segunda vez, a posição correta é imediatamente retornada sem diálogo ou erros.
A posição é retornada e nenhum erro é gerado ao solicitar a posição e a aprovação do usuário.
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
}
Versão do Flutter: "Channel dev, v1.5.8"
Versão do Geolocator: ^ 4.0.2
Plataforma:
@FlashJonas recentemente geolocator
(versão 5.0.0) e eu gostaria de saber se você ainda enfrenta esse problema na versão mais recente?
@mvanbeusekom Eu confirmo que o problema ainda existe no 5.0.0
acabou de descobrir seu pacote por meio de cursos do AppBrewery.
Decidi seguir a documentação dos pacotes e adicionei ao meu arquivo plist as 3 chaves:
<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>
Primeira chamada para
Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
solicitar permissão do usuário (com 3 opções):
Se eu pressionar "apenas durante o uso do aplicativo", o terminal registrará o seguinte:
[VERBOSE-2: ui_dart_state.cc (148)] Exceção não tratada: PlatformException (PERMISSION_DENIED, acesso a dados de localização negado, nulo)
0 Geolocator._handleInvalidPermissions (pacote: geolocator / geolocalização.dart: 191: 7)
1 Geolocator.getCurrentPosition (pacote: geolocator / geolocator.dart: 102: 7)
2 _LoadingScreenState.getLocation (pacote: clima / telas / loading_screen.dart: 13: 10)
3 _LoadingScreenState.build.
(pacote: clima / telas / loading_screen.dart: 23: 13) 4 _InkResponseState._handleTap (pacote: flutter / src / material / ink_well.dart: 511: 14)
5 _InkResponseState.build.
(pacote: flutter / src / material / ink_well.dart: 566: 30) 6 GestureRecognizer.invokeCallback (pacote: flutter / src / gestures / reconhecizer.dart: 166: 24)
7 TapGestureRecognizer._checkUp (pacote: flutter / src / gestures / tap.dart: 240: 9)
8 TapGestureRecognizer.handlePrimaryPointer (pacote: flutter / src / gestures / tap.dart: 177: 9)
9 <…>
A segunda pressão está ok e a posição é registrada sem problemas:
vibração: Lat: 37,785834, Longo: -122,406417
Código:
Ainda tenho o mesmo problema no meu iPhone 5s, 12.2, usando o geolocalizador 5.1.2.
* editar (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
}
}
Logs de execução do código acima:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy
Eu enfrento o mesmo erro:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(Permissão de localização é concedida)
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)
Recebi o mesmo erro quando usei todas as três strings de permissão. Se eu usar apenas NSLocationWhenInUseUsageDescription, o aplicativo estará funcionando novamente. Meu melhor palpite é que, ao usar todas as três permissões, o aplicativo é iniciado e solicita a localização antes de o usuário ser solicitado a confirmá-la. O comportamento da interface do usuário parece confirmar isso, mas é apenas um palpite. De qualquer forma, se você pode viver apenas com NSLocationWhenInUseUsageDescription, remova os outros dois.
mesmo problema :( no canal estável da última versão de vibração.
este pacote é uma merda ...
Mesmo erro, última versão do flutter no Android 10.
Eu tenho o mesmo problema!
Eu me pergunto se esse problema vai ser resolvido, vejo que tem mais de um ano e as pessoas ainda o enfrentam. Recentemente comecei a aprender Flutter e me deparei com o mesmo problema, com exatamente as mesmas etapas para reproduzir.
Quando seleciono a opção "Somente ao usar o aplicativo" no prompt do iOS, recebo uma exceção no console de vibração, mesmo que na segunda vez que solicite o local do aplicativo obtenho os dados de localização corretos.
PS usando a versão 5.3.2+2
recente
Atualmente, estou trabalhando em uma correção para este e uma lista de outros problemas (consulte # 430, para obter mais detalhes). No entanto, será uma grande atualização.
Atualmente, o lado iOS está pronto e funcionará no lado Android agora.
Isso deve ser corrigido na versão 6.0.0
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 no Android.
Porque não foi solicitada 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
Importe o pacote no arquivo
import ' package: location_permissions / location_permissions.dart ';
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();
}
....
}
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
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.
Comentários muito úteis
Atualmente, estou trabalhando em uma correção para este e uma lista de outros problemas (consulte # 430, para obter mais detalhes). No entanto, será uma grande atualização.
Atualmente, o lado iOS está pronto e funcionará no lado Android agora.