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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top