Détecter la position sur Wear OS

Le petit format d'une montre, lisible d'un coup d'œil, fait de Wear OS la plate-forme idéale pour les applications qui enregistrent, signalent et réagissent à la position de l'utilisateur. Par exemple, vous pouvez créer des applications offrant aux utilisateurs des notifications en temps réel sur la distance, la vitesse et la direction ou des signaux lisibles d'un coup d'œil sur leur environnement.

Pour en savoir plus, consultez la section Développer des applications utilisant la détection de la position.

Certaines montres sont dotées d'un capteur GPS intégré qui récupère les données de localisation sans nécessiter de téléphone connecté. Lorsque vous demandez des données de localisation dans l'application de la montre, le système obtient la position du téléphone ou de la montre à l'aide de la méthode la plus économe en énergie. Ainsi, même si la montre n'est pas équipée d'un capteur GPS, vous pouvez tout de même obtenir des informations de localisation.

Pour réduire l'impact de l'acquisition des données de localisation sur l'autonomie de la batterie, appelez setPriority() avec la valeur PRIORITY_BALANCED_POWER_ACCURACY. Différents paramètres de priorité peuvent optimiser les puces différemment.

Dans la mesure du possible, demandez un emplacement au maximum une fois par minute à l'aide de setInterval() pour économiser de la batterie.

Comme décrit dans les sections suivantes, votre application doit gérer la perte des données de localisation lorsqu'une montre sans capteur se déconnecte d'un téléphone.

Choisir une méthode

Vous pouvez fournir des données de localisation à une application Wear OS de plusieurs manières différentes. Vous pouvez utiliser le Fused Location Provider (FLP) ou les Services Santé de Wear (WHS). FLP est une API des services Google Play.

Utilisez FLP dans les cas suivants :

  • Vous souhaitez obtenir des données de localisation à un moment précis, mais pas en continu (par exemple, pour indiquer l'emplacement d'une voiture garée).
  • Vous voulez activer la localisation en continu, mais que vous n'avez pas besoin de l'historique des positions.

Utilisez WHS dans les cas suivants :

  • Vous souhaitez collecter des données provenant d'autres capteurs ou vous êtes susceptibles d'être intéressés par les données d'autres capteurs à l'avenir.
  • Vous avez une application d'entraînement ou d'exercice qui doit suivre les données de localisation au cours d'un intervalle de temps spécifique.

Pour les montres associées à des iPhone, consultez la section Données de localisation des montres associées à des iPhone.

Utiliser le Fused Location Provider

Sur une montre, récupérez les données de localisation à l'aide du FusedLocationProviderClient. Le FLP peut utiliser les données de localisation du téléphone. Pour en savoir plus, consultez la section Créer un client de services de localisation.

Pour en savoir plus sur la demande de notification de position et sur le suivi continu de la position d'un utilisateur, consultez Demander des notifications de position.

Détecter le GPS intégré

Si un utilisateur fait du jogging avec une montre sans capteur GPS intégré et qu'il n'emporte pas le téléphone associé, l'application de la montre ne peut pas obtenir de données de localisation via l'appareil connecté. Détectez cette situation dans votre application et avertissez l'utilisateur que les fonctionnalités de localisation ne sont pas disponibles.

Pour déterminer si une montre dispose d'un capteur GPS intégré, appelez la méthode hasSystemFeature() avec PackageManager.FEATURE_LOCATION_GPS. Le code suivant détecte si la montre dispose d'un capteur GPS intégré lorsque vous commencez une activité :

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

Gérer les événements de déconnexion

Si la montre n'est pas équipée d'un capteur GPS et perd la connexion avec un téléphone, elle perd son flux de données de localisation. Si votre application attend un flux constant de données, elle doit détecter la perte de connexion, avertir l'utilisateur et réaliser une dégradation élégante des fonctionnalités.

Comme pour un appareil mobile, lorsque vous demandez des notifications de position à l'aide de FusedLocationProviderClient.requestLocationUpdates(), vous transmettez un LocationCallback ou un PendingIntent. Les deux comprennent les informations de localisation et l'état LocationAvailability.

Lorsque vous utilisez l'option LocationCallback, remplacez onLocationAvailability() pour recevoir des informations sur l'état de disponibilité de la localisation.

Lorsque vous utilisez l'option PendingIntent et qu'un Intent est renvoyé, extrayez l'état de disponibilité de la localisation à partir de l'Intent à l'aide de la méthode LocationAvailability.extractLocationAvailability(Intent).

Gérer la position introuvable

Lorsque le signal GPS est perdu, vous pouvez récupérer la dernière position connue de la montre de l'utilisateur. La récupération de la dernière position connue est utile lorsque vous ne pouvez pas obtenir une position GPS et lorsque la montre n'est pas équipée d'un GPS intégré et perd sa connexion au téléphone. Pour en savoir plus, consultez la section Obtenir la dernière position connue.

Vider les localisations avec les appels par lot

Si vous utilisez les appels par lot, appelez flushLocations() lorsque l'écran se rallume ou sort du mode Veille pour renvoyer immédiatement toutes les localisations par lot à l'ensemble des LocationListeners, LocationCallbacks et Pending Intents enregistrés.