Detectar la ubicación en Wear OS

El factor de forma fácilmente visible y pequeño de un reloj hace de Wear OS una plataforma ideal para apps que informan y registran la ubicación del usuario, y responden a ella. A modo de ejemplo, puedes compilar apps que proporcionen a los usuarios actualizaciones en tiempo real sobre distancia, instrucciones sobre cómo llegar a un lugar y velocidad, o filas visibles sobre los alrededores de los usuarios.

Para obtener más información, consulta Crea apps de reconocimiento de la ubicación.

Algunos relojes tienen un sensor de GPS integrado que obtiene datos de ubicación sin requerir que el teléfono esté conectado. Cuando solicites datos de ubicación en una app de reloj, el sistema obtendrá la ubicación del teléfono o del reloj con el método que ahorre más batería. Incluso si no tienes un sensor GPS en el reloj, puedes obtener información de ubicación.

Para reducir el impacto de la adquisición de datos de ubicación en la duración de la batería, llama a setPriority() con el valor PRIORITY_BALANCED_POWER_ACCURACY. Las diferentes opciones de configuración de prioridad pueden optimizar los chips de manera diferente.

Si quieres ahorrar batería, cuando sea posible, solicita la ubicación, como máximo, una vez por minuto con setInterval().

Como se describe en las siguientes secciones, tu app debe controlar la pérdida de datos de ubicación cuando un reloj sin sensor se desconecta de un teléfono.

Elige tu método

Hay dos formas de proporcionar datos de ubicación a una app para Wear OS. Puedes usar el proveedor de ubicación combinada (FLP) o los Servicios de salud de Wear (WHS). FLP es una API de los Servicios de Google Play.

Usa FLP en las siguientes circunstancias:

  • Quieres datos de ubicación en el momento, pero no continuamente, como para marcar la ubicación de un vehículo estacionado.
  • Quieres la ubicación continuamente, pero no necesitas el historial.

Usa WHS en las siguientes circunstancias:

  • Quieres datos de otros sensores o posiblemente quieras datos de otros sensores en el futuro.
  • Tu app es una app de entrenamiento o ejercicio que necesita hacer un seguimiento de los datos de ubicación durante un intervalo de tiempo específico.

Para relojes sincronizados con iPhones, consulta Datos de ubicación para relojes sincronizados con iPhones.

Cómo usar el proveedor de ubicación combinada

En un reloj, obtén datos de ubicación usando FusedLocationProviderClient. Es posible que el FLP use datos de ubicación del teléfono. Para obtener más información, consulta Cómo crear un cliente de servicios de ubicación.

Si quieres obtener información para solicitar actualizaciones de ubicación y realizar un seguimiento continuo de la ubicación de un usuario, consulta Cómo solicitar actualizaciones de ubicación.

Cómo detectar un GPS incorporado

Si un usuario sale a correr con un reloj sin sensor GPS integrado y no lleva consigo el teléfono vinculado, la app de reloj no podrá obtener datos de ubicación desde el dispositivo conectado. Detecta esta situación en tu app y advierte al usuario que la función de ubicación no está disponible.

Para determinar si un reloj tiene un sensor GPS integrado, llama al método hasSystemFeature() con PackageManager.FEATURE_LOCATION_GPS. El siguiente código detecta si el reloj tiene un sensor GPS integrado cuando inicias una actividad:

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);
}

Cómo controlar eventos de desconexión

Si un reloj no tiene sensor GPS incorporado y pierde la conexión con un teléfono, perderá su transmisión de datos de ubicación. Si tu app espera una transmisión de datos constante, debe poder detectar la pérdida de conexión, advertir al usuario y realizar una degradación elegante de la funcionalidad.

Al igual que con un dispositivo móvil, cuando solicitas actualizaciones de ubicación mediante FusedLocationProviderClient.requestLocationUpdates(), pasas un LocationCallback o un PendingIntent. Ambos incluyen la información de ubicación y el estado LocationAvailability.

Cuando uses la opción LocationCallback, anula onLocationAvailability() para recibir actualizaciones sobre el estado de disponibilidad de la ubicación.

Cuando uses la opción PendingIntent y se muestre un Intent, extrae el estado de disponibilidad de la ubicación del Intent con el método LocationAvailability.extractLocationAvailability(Intent).

Cómo controlar ubicaciones no encontradas

Cuando se pierde la señal de GPS, puedes recuperar la última ubicación conocida del reloj del usuario. Esta acción resulta útil cuando no puedes obtener datos del GPS o cuando el reloj no posee un GPS integrado y pierde la conexión con el teléfono. Para obtener más información, consulta Cómo obtener la última ubicación conocida.

Cómo vaciar ubicaciones con llamadas en lote

Si usas llamadas por lotes, llama a flushLocations() cuando se vuelva a encender la pantalla (o vuelva del modo ambiente) para mostrar inmediatamente las ubicaciones por lotes a todos los elementos registrados LocationListeners, LocationCallbacks y Pending Intents.