Detectar a localização no Wear OS

O formato pequeno e de fácil visualização de um smartwatch faz com que o Wear OS seja a plataforma ideal para apps que registram, informam e respondem à localização do usuário. Por exemplo, você pode criar apps que fornecem atualizações em tempo real sobre a distância, velocidade e direção do usuário ou que mostrem informações de fácil visualização sobre o local em que ele se encontra.

Para ver mais informações, consulte Criar apps com reconhecimento de local.

Alguns relógios têm um sensor de GPS integrado que recupera dados de local sem exigir um smartphone conectado. Quando você solicita dados de local em um app para smartwatch, o sistema recupera a localização do smartphone ou do relógio usando o método mais eficiente em termos de energia. Assim, mesmo que o relógio não tenha um sensor de GPS, ainda é possível receber informações de localização.

Para reduzir o efeito da aquisição de dados de local na duração da bateria, chame setPriority() com o valor PRIORITY_BALANCED_POWER_ACCURACY. Configurações de prioridade diferentes podem otimizar os ícones de forma diferente.

Quando possível, economize bateria solicitando o local no máximo uma vez por minuto usando setInterval().

O app precisa processar a perda de dados de local quando um relógio que não tem sensor de GPS perde a conexão com o smartphone. Esse comportamento será abordado nas próximas seções.

Escolher o método

Existem algumas maneiras de fornecer dados de local a um app para Wear OS. Você pode usar o provedor de localização combinada (FLP, na sigla em inglês) ou os Recursos de saúde do Wear (WHS, na sigla em inglês). O FLP é uma API do Google Play Services.

Use o FLP nas seguintes circunstâncias:

  • O app precisa receber dados de local no momento, mas não de maneira contínua, como para marcar a localização de um carro estacionado.
  • O app precisa receber dados de local continuamente, mas não precisa armazenar um histórico de localização.

Use o WHS nas seguintes circunstâncias:

  • O app precisa receber dados de outros sensores ou pode vir a receber dados de outros sensores no futuro.
  • O app é usado para treinos ou exercícios e precisa monitorar os dados de local ao longo de um intervalo específico.

Para relógios pareados com iPhones, consulte Dados de localização para relógios pareados com iPhones.

Usar o provedor de localização combinada

Para receber os dados de local em um smartwatch, use FusedLocationProviderClient. O FLP pode usar dados de local do smartphone. Para mais informações, consulte Criar clientes de Serviços de localização.

Para ver mais informações sobre como solicitar atualizações de local e rastrear a localização do usuário continuamente, consulte Solicitar atualizações de localização.

Detectar GPS integrado

Se o usuário sair para uma corrida com um relógio que não tem sensor de GPS integrado e não levar o smartphone pareado com ele, o app para smartwatch não vai receber os dados de localização do dispositivo conectado. Detecte essa situação no seu app e informe ao usuário que os recursos de localização não estão disponíveis.

Para determinar se um relógio tem sensor de GPS integrado, chame o método hasSystemFeature() com PackageManager.FEATURE_LOCATION_GPS. O código a seguir detectará se o relógio tem um sensor de GPS integrado quando você iniciar uma atividade:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.")
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
}

private fun hasGps(): Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)

Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.");
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
    ...
}

private boolean hasGps() {
    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
}

Processar eventos de desconexão

Quando um smartwatch sem sensor de GPS integrado perde a conexão com um smartphone, ele perde o fluxo de dados de local. Se o seu app precisar de um fluxo de dados constante, ele precisará detectar a perda de conexão, avisar o usuário e desativar a funcionalidade de forma adequada.

Assim como em um dispositivo móvel, ao solicitar atualizações de localização usando FusedLocationProviderClient.requestLocationUpdates(), o app transmite um LocationCallback ou uma PendingIntent. Ambos incluem informações de localização e o status de LocationAvailability.

Ao usar LocationCallback, modifique onLocationAvailability() para receber atualizações sobre o status de disponibilidade de localização.

Se optar por usar PendingIntent e retornar uma Intent, extraia o status de disponibilidade de localização da Intent usando o método LocationAvailability.extractLocationAvailability(Intent).

Processar localização não encontrada

Quando o app perde o sinal GPS, é possível recuperar a última localização conhecida do relógio do usuário. Esse recurso é útil quando não é possível restaurar o sinal e quando o relógio não tem um GPS integrado e perde a conexão com o smartphone. Para saber mais, consulte Ver a última localização conhecida.

Transferir dados de local com chamadas em lote

Caso esteja usando chamadas em lote, chame flushLocations() quando a tela for reativada ou quando retornar do modo ambiente para enviar de forma imediata os dados de local em lote para todos os LocationListeners, LocationCallbacks e Pending Intents registrados.