Pesquisa de GPS e preferência do usuário
-
26-09-2019 - |
Pergunta
Estou começando a mergulhar os dedos dos pés no LocationManager. Eu criei um serviço que rastreia o local do GPS (o intervalo é superior a 60000ms) e atualiza meu aplicativo com o local do usuário para que eles possam encontrar coisas nas proximidades.
Pelo que entendi, os usuários podem entrar em suas preferências e desativar o GPS para um aplicativo específico.
Eu gostaria de oferecer aos meus usuários dois modos. 1) GPS. 2) se O GPS não pode puxar, o dispositivo não possui um chip GPS ou o GPS está desligado para o meu aplicativo, Eu gostaria de permitir que eles digitem seu código postal (ou talvez mude para a pesquisa da torre de celular).
O texto em negrito é o que estou interessado. Como posso saber se o dispositivo não possui GPS? Como posso saber se o usuário desativou o GPS para o meu aplicativo?
Pergunta lateral: Meu serviço é lançado a partir da minha segunda atividade. Eu chamo de StopService no método OnDestroy dessa atividade. Se eu voltar à minha 1ª atividade e a segunda atividade for destruída, ainda noto o ícone GPS no meu telefone em execução. Interromper o serviço é suficiente? Ou preciso parar o local de localização no OnDestroy do Serviço?
Solução
Se um usuário não tiver o GPS ativado, ele ainda poderá ter WiFi/rede ativado como uma fonte de localização nas configurações do telefone; portanto, você também pode usar esses dados.
Você sempre pode obter o último local conhecido do GPS ou rede via
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
e/ou
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
Ele contém o último local conhecido pelo dispositivo, que pode ser do seu aplicativo ou de qualquer outro aplicativo que já tenha usado o GPS antes.
Na verdade, você pode usar dois gerentes de localização com diferentes fornecedores: um com GPS_Provider e outro com o Network_Provider. O GPS é mais preciso, mas geralmente só funciona ao ar livre no céu livre, por que o Network_Provider funciona dentro de casa, mas é menos preciso. Além disso, o GPS pode demorar um pouco até obter uma primeira correção após a inicialização (às vezes, ou seja, um minuto ou mais), enquanto a rede obtém o local quase imediatamente.
Você deve ler este post, é muito detalhado e tem código de amostra: Qual é a maneira mais simples e robusta de obter a localização atual do usuário no Android?
Em relação à segunda pergunta: Antes de interromper o serviço, você também deve registrar o ouvinte do local. Você pode fazer isso na Pausa ou OnDestroy.
locationManager.removeUpdates(baseLocationListener)
ou
locationManager.removeAllUpdates()
Eu acho que no seu caso usar getLastknowlocation () está bem.
No entanto, se você quiser saber explicitamente sobre o status do GPS, pode implementar um ouvinte de status GPS e depois usar algo como abaixo, o que diz se o GPS tem alguma correção de satélite ou não - mas, como dito, não acho que isso é realmente necessário.
final class GpsStatusListener implements GpsStatus.Listener {
public void onGpsStatusChanged(int i) {
if (i==GpsStatus.GPS_EVENT_FIRST_FIX) {
Log.d(AskTingTing.APP, "gpsx.fixed.");
for (GpsSatellite sat:locationManager.getGpsStatus(null).getSatellites()) {
Log.d(AskTingTing.APP, "gpsx.GpsStatus.Sat.fixed: " + sat.usedInFix());
}
}
}
}
Veja o link acima para uma boa amostra de código.
Outras dicas
Se o dispositivo não tiver GPS ou não estiver disponível, os valores retornados (LAT, LNG) pelo gerente de localização serão iguais a null
Portanto, basta verificar os valores e solicitar o usuário a inserir sua localização. Eu recomendo o geocodificação reversa para obter um valor LAT/LNG para a localização deles nessa instância.
Pergunta lateral: não tenho tanto certeza de que você precisaria destruí -lo se ainda estiver em execução.