Flutter-geolocator: Android Pie (API 28) Geolocator (). GetCurrentPosition () não retorna

Criado em 2 nov. 2018  ·  39Comentários  ·  Fonte: Baseflow/flutter-geolocator

🐛 Relatório de Bug

Quando executo o Geolocator (). GetCurrentPosition () no Android Emulator com Android Pie (API 28), a chamada não está retornando.

Eu executo o mesmo código nos retornos de localização API 27 bem. Tentei criar um novo emulador, nada muda.

Configuração

Emulador Android com Android Pie (API 28)

Versão: 2.1.0

Plataforma:

  • []: iphone: iOS
  • [X]: robô: Android
android

Comentários muito úteis

Tenho o mesmo problema e configurei um tempo limite para funcionar. Quando o tempo limite ocorre, eu chamo getLastKnownPosition ()

Geolocator().getCurrentPosition().timeout(Duration(seconds: 10)).then((position) {
      //getting position without problems
      print(position);
    }).catchError((error) {
      if (error is TimeoutException) {
        Geolocator().getLastKnownPosition().then((position) {
          //getting last known position
          print(position);
        }).catchError((error) {
          //handle the exception
        });
      } else {
        //handle the exception
      }
    });

Você também pode fazer o mesmo com o stream

Todos 39 comentários

eu também, o que há de errado? :(

Mesmo aqui!

@savjolovs se eu depurar, o depurador para no Geolocator (). getCurrentPosition (). Os pontos de interrupção após o mehtod não estão sendo atingidos. Você pode confirmar este comportamento?

O mesmo comportamento aqui até empurrar algumas coordenadas usando controles estendidos.
Mesmo comportamento com um dos dois dispositivos phisycal. Primeiro com android 5 - funciona bem, outro com 6 - sem resposta até que a localização do fakegps seja ativada.

+1 aqui

Alguém tem ideia de qual é a causa? Esse recurso está quebrando tudo, alguém tentou outro plugin?

Verificando o óbvio, para aqueles com o problema, você tem um sinal de GPS para obter uma localização e se mudar? Apenas me perguntando se ele ficou lá esperando por algum novo local antes de atualizar?

Parece que @ibrierley não consegue obter o sinal de GPS com ou sem movimento, mas, ao mesmo tempo, diferentes aplicativos como o Google Maps não têm problemas para localizar a posição atual. lastKnownPosition retorna a localização por cerca de algumas centenas de metros de distância. Com o android 5 não tenho nenhum problema, mesmo sem pedir a permissão de localização (mas não tenho certeza, pode ser que perdi isso na depuração)

Mesmos problemas no Android oreo, exceto que você fecha e abre o aplicativo novamente

Estou mexendo em um relógio Android Wear e tive muitos problemas com o GPS, mas parece que ele está funcionando principalmente (pode expirar depois de muito tempo, mas acho que é um problema diferente).

Não tenho certeza do que exatamente funcionou, já que tentei várias coisas, mas talvez alguém possa verificar e ver se ajudam.

0) Certifique-se de que seu dispositivo pode obter um sinal de GPS, para fora ou alimente-o de localizações através do emulador (eu alimentei uma rota GPX que baixei para testar).

1) Certifique-se de que a tela esteja ligada. O GPS pode parar de retornar resultados se estiver no modo mínimo, seja como for chamado. Eu forço a tela quando necessário com o pacote Screen e Screen.keepOn (true); Se a tela estiver desligada, parece reter e armazenar em buffer um conjunto de locais até que a tela seja ligada novamente.

2) Estas são minhas permissões em AndroidManifest.xml, talvez valha a pena tentar

`` `




Observe especialmente o último, pois acho que houve uma mudança ao longo do caminho em uma versão e pareceu ajudar. Você pode não querer o wake_lock por motivos de bateria, mas pode ser útil tentar isso para eliminar onde está o problema.

3) Tive estranhezas com o tempo limite do stream, então acabei iniciando o stream com geolocator.getPositionStream, mas não o usei de fato. Com o fluxo em execução, estou chamando getCurrentPosition (desejadoAccuracy: LocationAccuracy.high) com base em um cronômetro. Acho que isso não é necessário agora, pois acho que meu problema original era a tela estar desligada, mas pode valer a pena tentar apenas por interesse.

Se alguém tentar o procedimento acima e não conseguir fazer funcionar, você pode criar um aplicativo de flutter mínimo, apenas com o material de localização, e verei se falha da mesma forma no meu. É muito mais doloroso ir do que deveria: /.

Obrigado @ibrierley por sua informação, tentarei o mais rápido possível e relatarei sobre minha experiência resolvendo o problema.

Fiz alguma pesquisa hoje com ferramentas adicionais como teste de GPS em dispositivos físicos.
Portanto, não há resposta quando o satélite não está disponível pelo teste de GPS (0 conectado 1 disponível por causa de nuvens e grandes edifícios ao redor), mesmo o google map ou outros serviços de mapas estão funcionando.
Nenhuma resposta quando o satélite está online, mas a distância definida nas opções de localização, mas não 100% neste caso - é necessário algum tipo de deriva GPS para ter as coordenadas iniciais.
Fiz alguns truques com lastknownlocation para posicionar ali para iniciar o aplicativo que exige a localização atual antes que os dados de localização reais estejam disponíveis.
Provavelmente seria uma ótima solução ter algum tipo de flag como isReady com possível callback no Geolocator que indica que o serviço GPS está pronto para oferecer dados de localização por meio de stream.

Alguém já tentou, por exemplo, isso: https://github.com/Lyokone/flutterlocation , ou este: https://github.com/Lyokone/flutterlocation ? Portanto, podemos excluir erros que não estão relacionados a este pacote.

Eu tentei isso e acabei com este (isso não quer dizer que não seja
vale a pena tentar!). Todos eles têm 'alguns' problemas, acho realmente
porque o Android tem algumas coisas que não são óbvias.

Normalmente eu descobri quando um local não é retornado em nenhum dos
pacotes), é por causa de um problema de não vibração (por exemplo, o GPS entrou
modo de espera ou sem sinal GPS).

Na quinta-feira, 15 de novembro de 2018 às 19h26 HerrNiklasRaab [email protected]
escreveu:

Alguém já tentou, por exemplo:
https://github.com/Lyokone/flutterlocation ou este:
https://github.com/Lyokone/flutterlocation ? Portanto, podemos excluir erros que
não estão relacionados a este pacote.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/BaseflowIT/flutter-geolocator/issues/135#issuecomment-439160446 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ADuG9WRbZuJYvi5N_2xrrku-Jurk6trIks5uvb_SgaJpZM4YKDSm
.

Alguém experimenta o meu?
flutter_background_geolocation

Funciona com a tela desligada fora do interesse?

Na quinta-feira, 15 de novembro de 2018 às 20h16, Chris Scott [email protected]
escreveu:

Alguém experimenta o meu?
flutter_background_geolocation
https://pub.dartlang.org/packages/flutter_background_geolocation#-readme-tab-

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/BaseflowIT/flutter-geolocator/issues/135#issuecomment-439175841 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ADuG9f5uvZK0lDnYecMoFZhJnF0ylz6Pks5uvcuygaJpZM4YKDSm
.

Funciona mesmo se você encerrar seu aplicativo ( stopOnTerminate: false ) ou reiniciar o dispositivo ( startOnBoot: true ).

Estou enfrentando o mesmo problema, que nunca está voltando de getCurrentPosition .
Eu tenho o seguinte código:
position = await Geolocator() .getCurrentPosition(desiredAccuracy: LocationAccuracy.best); setState(() { _position = position; }); if (position == null) Fluttertoast.showToast( msg: 'Position is null', toastLength: Toast.LENGTH_SHORT); else Fluttertoast.showToast( msg: 'Got Position', toastLength: Toast.LENGTH_SHORT);

As permissões são:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.hardware.location.gps" /> <uses-permission android:name="android.hardware.location.network" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> .
Quando executo o programa, o indicador de localização aparece na parte superior da tela e fica parado até que eu feche o programa.
Alguma ajuda, por favor?

O mesmo acontece, getCurrentPosition não funciona usando a API 23.
Alguma solução alternativa para este ou qualquer pacote alternativo funcionando para obter a posição atual?

É um pouco complicado. Eu poderia fazê-lo funcionar agora iniciando o aplicativo Google Map primeiro e permitindo que ele pedisse permissão para habilitar o GPS ao tocar em minha localização. Depois disso, getCurrentPosition de repente funcionou perfeitamente.

No meu caso, não consigo recuperar a localização com nenhuma API, não tenho certeza se isso pode resolver seus problemas, mas
Tentei remover o operador NOT aqui, adicionei a instrução return e funcionou. https://github.com/BaseflowIT/flutter-geolocator/blob/master/android/src/main/java/com/baseflow/flutter/plugin/geolocator/tasks/LocationUpdatesUsingLocationManagerTask.java#L52

// If we are listening to multiple location updates we can go ahead
// and report back the last known location (if we have one).
if(mStopAfterFirstLocationUpdate && mBestLocation != null) {
reportLocationUpdate(mBestLocation);
return;
}

Acabei de descobrir isso porque precisava obter uma solução realmente rápida depois de usar outro plug-in que me deixou para baixo na produção. Posso confirmar que testei isso na API 23 (dispositivo físico), API 24 (dispositivo físico) e API 28 (dispositivo físico) e não tive nenhum problema com isso. Na API 23, fui questionado se eu queria ajudar o Google a melhorar a localização, etc, e apenas disse que sim, carregava a localização após cerca de 20 segundos. No passado, tive problemas reais para fazer com que os emuladores retornassem locais (desenvolvimento nativo do Android), então poderia ser apenas um problema de emulador?

Tenho o mesmo problema e configurei um tempo limite para funcionar. Quando o tempo limite ocorre, eu chamo getLastKnownPosition ()

Geolocator().getCurrentPosition().timeout(Duration(seconds: 10)).then((position) {
      //getting position without problems
      print(position);
    }).catchError((error) {
      if (error is TimeoutException) {
        Geolocator().getLastKnownPosition().then((position) {
          //getting last known position
          print(position);
        }).catchError((error) {
          //handle the exception
        });
      } else {
        //handle the exception
      }
    });

Você também pode fazer o mesmo com o stream

@NMateu Obrigado por sua contribuição. Isso foi muito útil!

Eu tive o mesmo problema no emulador, mas .forceAndroidLocationManager = true; consertou para mim. Parece que o gerenciador de localização fusionado às vezes atrapalha.

Alguma novidade sobre isso?

Alguém conseguiu resolver o problema? Eu realmente preciso fazer isso, pessoal!

O mesmo problema, ele funciona bem no dispositivo ios, mas não consegue obter a localização no android atualmente.

sim, posso realmente obter o endereço com o método de colocação placemarkFromAddress . Mas o local em si está quebrado.

mesmo problema aqui

void _getUserLocation () async {
Geolocator geolocator = Geolocator () .. forceAndroidLocationManager = true;
GeolocationStatus geolocalizaçãoStatus = await geolocator.checkGeolocationPermissionStatus ();
Posição posição = espera geolocator ()
.getCurrentPosition (desejadoAccuracy: LocationAccuracy.high);
Listamarcador = espera Geolocator ()
.placemarkFromCoordinates (position.latitude, position.longitude);
imprimir("-----------------");
imprimir (marcador [0] .posição);
imprimir (geolocator.toString ());
imprimir (geolocalizaçãoStatus.toString ());
setState (() {
_initialPosition = LatLng (position.latitude, position.longitude);

  locationController.text = placemark[0].name;
});

}

está mostrando o local errado.

I / flutter (7363): Lat: 37,421999899999996, Longo: -122,08405750000001
I / flutter (7363): Instância de 'Geolocator'
I / flutter (7363): GeolocationStatus.granted

void _getUserLocation () async {
Geolocator geolocator = Geolocator () .. forceAndroidLocationManager = true;
GeolocationStatus geolocalizaçãoStatus = await geolocator.checkGeolocationPermissionStatus ();
Posição posição = espera geolocator ()
.getCurrentPosition (desejadoAccuracy: LocationAccuracy.high);
Listar marcador = esperar Geolocator ()
.placemarkFromCoordinates (position.latitude, position.longitude);
imprimir("-----------------");
imprimir (marcador [0] .posição);
imprimir (geolocator.toString ());
imprimir (geolocalizaçãoStatus.toString ());
setState (() {
_initialPosition = LatLng (position.latitude, position.longitude);

  locationController.text = placemark[0].name;
});

}

Funciona no emulador com este trecho
Geolocator()..forceAndroidLocationManager = true;

Este pacote funcionou como charme para tudo

(https://github.com/alfanhui/new_geolocation)

Eu estava enfrentando o mesmo problema com poucos dispositivos Android. Mas eu encontrei uma fonte para isso -

Tudo que você precisa fazer é definir o valor de Geolocator () .. forceAndroidLocationManager = true.

geolocator final geolocator = Geolocator () .. forceAndroidLocationManager = true;

Resolvido na versão 6.0.0

Posição posição = espera Geolocator.getCurrentPosition (
desejadoAccuracy: LocationAccuracy.low, forceAndroidLocationManager: true);
Corrigiu meus problemas

Estou recebendo um erro na linha forceAndroidLocationManager, mostrando a linha vermelha e o erro é que ... "O configurador 'forceAndroidLocationManager' não está definido para o tipo 'Geolocator'.
Tente importar a biblioteca que define 'forceAndroidLocationManager', corrigindo o nome para o nome de um setter existente ou definindo um setter ou campo chamado 'forceAndroidLocationManager'. "......... por favor, alguém pode me ajudar com isso

@ aditikumar-png qual versão do geolocalização você está usando? Você provavelmente atualizou para a versão 6.x recentemente. Esta versão tem uma alteração significativa. Movemos a propriedade Geolocator().forceAndroidLocationManager para um parâmetro nomeado nos métodos getCurrentPosition e getPositionStream .

Isso significa que agora você pode usar o geolocalização assim:

final position = await Geolocator.getCurrentPosition(forceAndroidLocationManager: true);

em vez do antigo:

final geolocator = Geolocator();
geolocator.forceAndroidLocationManager = true;

final position = await geolocator.getCurrentPosition();

@ aditikumar-png qual versão do geolocalização você está usando? Você provavelmente atualizou para a versão 6.x recentemente. Esta versão tem uma alteração significativa. Movemos a propriedade Geolocator().forceAndroidLocationManager para um parâmetro nomeado nos métodos getCurrentPosition e getPositionStream .

Isso significa que agora você pode usar o geolocalização assim:

final position = await Geolocator.getCurrentPosition(forceAndroidLocationManager: true);

em vez do antigo:

final geolocator = Geolocator();
geolocator.forceAndroidLocationManager = true;

final position = await geolocator.getCurrentPosition();

Muito obrigado!!!!! você resolveu meu problema em segundos, eu estava lutando com isso desde as 9 horas

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