Localização e GPS
Três peças, para três necessidades. Os callbacks disparam fora da paint thread → volte com
Component.onUI(...).
| Classe | Para |
|---|---|
Location |
leitura ao vivo (singleton — uma instância por vez) |
LocationService |
coleta em background, gravando em arquivo (“ler e limpar”) |
GPSThread |
rastreamento contínuo com callbacks |
Location — leitura ao vivo
Location loc = new Location(); // abre o GPS (throws IOException)
try {
if (loc.retrieveGPSData()) { // false = sem sinal/erro
double lat = Location.getLatitude();
double lon = Location.getLongitude();
double vel = Location.velocity; // ⚠️ em NÓS (knots)
if (vel != Location.INVALID) { ... } // cheque INVALID antes de confiar
} else {
Debug.log(Location.lowSignalReason);
}
} finally {
loc.stop(); // ⚠️ SEMPRE pare — esquecer drena bateria
}
Campos estáticos: location (double[] lat/lon), velocity (nós), pdop, satellites, direction,
lastFix, e o marcador INVALID = Double.MIN_VALUE.
LocationService — coleta em background
Grava fixes num arquivo; você lê e o arquivo é apagado (padrão “ler e limpar”):
LocationService.start(); // começa a coletar (no-op no desktop)
// … mais tarde …
List<LocationService.GPSLogEntry> fixes = LocationService.readAll(); // lê E apaga o arquivo
for (LocationService.GPSLogEntry e : fixes) {
double vel = e.velocity; // ⚠️ aqui em METROS POR SEGUNDO (m/s) — diferente de Location!
}
LocationService.stop();
⚠️ Unidades de velocity diferentes!
| Fonte | Unidade |
|---|---|
Location.velocity (ao vivo) |
nós (knots) |
GPSLogEntry.velocity (histórico) |
metros por segundo (m/s) |
Confundir as duas é um bug silencioso de conversão. Ambas usam INVALID para “sem leitura”.
GPSThread — rastreamento contínuo
GPSThread gps = new GPSThread(
true, // highPrecision: só GPS (false = GPS+célula+WiFi)
2000, // intervalo em ms
() -> Component.onUI(() -> label.setText(Location.getLatitude() + ", " + Location.getLongitude())),
erro -> Debug.log("GPS erro: " + erro)
); // já inicia ao construir
// … ao sair da tela:
gps.stopGps(); // para e aguarda a thread encerrar
Boas práticas
- Sempre
stop()/stopGps()ao sair — GPS ligado drena bateria. - Cheque
INVALID/pdopantes de confiar na posição. - Atenção às unidades de
velocity(nós vs m/s). - Callbacks voltam à UI com
onUI(...).
Erros comuns
- Esquecer
stop()→ bateria drenada. - Tratar
Location.velocitycomo m/s (é nós). - Confiar na posição sem checar
INVALID.
Veja também
Esta página foi útil?Obrigado pelo feedback!