Utiliser l'état de conduite de la voiture et les restrictions d'expérience utilisateur

Cette page explique comment les applications peuvent passer de manière fluide aux interfaces utilisateur optimisées pour la distraction (DO). Il décrit comment consommer l'état de conduite d'une voiture, ainsi que les restrictions d'expérience utilisateur correspondantes. Pour en savoir plus sur les restrictions liées à l'expérience utilisateur dans une voiture, consultez la section Restrictions liées à l'expérience utilisateur dans une voiture, qui détaille les trois états de conduite (stationné, au ralenti et en mouvement).

Audience

Ce contenu est destiné aux personnes qui souhaitent concevoir des applications qui s'adaptent aux changements d'état de conduite d'une voiture et aux restrictions d'expérience utilisateur imposées en conséquence.

Détails techniques

CarDrivingStateManager

L'état de conduite d'une voiture (stationnée, au ralenti ou en mouvement) est dérivé des valeurs des capteurs fournies par la couche d'abstraction matérielle du véhicule (VHAL, Vehicle Hardware Abstraction Layer). Les informations de base des capteurs, telles que la vitesse du véhicule et la sélection de vitesse actuelle, sont utilisées pour déterminer l'état de conduite actuel du véhicule.

CarDrivingStateEvent.

qui fournit @SystemApis, ce qui signifie que seuls les éléments internes de la plate-forme, les APK groupés (tels que SysUI ou Paramètres) et les APK privilégiés (tels que GMSCore) peuvent accéder aux API. Les API sont protégées par des autorisations spécifiques à l'état de conduite android.car.permission.CAR_DRIVING_STATE. Les clients qui ont besoin d'accéder aux informations sur l'état de conduite doivent demander cette autorisation.

CarUxRestrictionsManager

Les applications qui affichent une interface utilisateur dépendant de l'état de conduite doivent écouter CarUxRestrictionsManager, qui effectue une abstraction de la mise en correspondance de l'état de conduite avec les restrictions d'expérience utilisateur afin que les applications n'aient pas besoin de s'adapter aux différentes exigences de sécurité du marché.

Remarque: Ces activités doivent être marquées comme optimisées pour les distractions, comme décrit dans les consignes sur les distractions du conducteur. Si les activités ne sont pas marquées en conséquence, elles sont bloquées.

Au lieu de cela, les applications surveillent les restrictions exposées par CarUxRestrictionsManager et non un état de conduite absolu exposé par CarDrivingStateManager pour tout ce qui concerne l'interface utilisateur ou l'expérience utilisateur.

Exemple de code

L'exemple de code suivant montre comment une application surveille les restrictions d'expérience utilisateur:

  1. Importez les packages de bibliothèque de voitures:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
  2. Implémentez CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Cet écouteur, lorsqu'il est enregistré auprès de CarUxRestrictionsManager, est appelé lorsqu'une modification des restrictions d'expérience utilisateur se produit. Gérez les modifications de restriction pour optimiser les distractions, si nécessaire:
    @Nullable private CarUxRestrictionsManager mCarUxRestrictionsManager;
    private CarUxRestrictions mCurrentUxRestrictions;
    
    /* Implement the onUxRestrictionsChangedListener interface */
    private CarUxRestrictionsManager.OnUxRestrictionsChangedListener mUxrChangeListener =
                new CarUxRestrictionsManager.OnUxRestrictionsChangedListener()
        {
            @Override
            public void onUxRestrictionsChanged(CarUxRestrictions carUxRestrictions) {
            mCurrentUxRestrictions = carUxRestrictions;
            /* Handle the new restrictions */
            handleUxRestrictionsChanged(carUxRestrictions);
            }
        };
      
  3. Appelez les API de voiture pour créer une instance de voiture nommée mCar et vous connecter au service de voiture:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
  4. Appelez mCar.getCarManager() - mCarUxRestrictionsManager pour obtenir le CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
  5. Pour enregistrer mUxRChangeListener implémenté à l'étape 2 ci-dessus avec l'appel CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Le bloc d'exemple de code terminé (créé aux étapes 3 à 5) permet à l'écouteur de recevoir des modifications de restriction lorsque l'état du lecteur change:

mCar = Car.createCar(context);
if (mCar == null) {
// handle car connection error
}

CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
mUxrChangeListener.onUxRestrictionsChanged(
mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

CarUxRestrictions

L'objet CarUxRestrictions fournit deux types d'informations:

  1. Existe-t-il actuellement une exigence d'optimisation contre les distractions ?
  2. Si oui, quelles restrictions sont actuellement en vigueur ?

Lorsque CarUxRestrictions est obtenu à partir de getCurrentUxRestrictions() ou du rappel de l'écouteur, les applications peuvent désormais utiliser l'API isRequiresDistractionOptimization() pour déterminer si la fonctionnalité Optimisation pour la distraction est requise. Si cette valeur renvoie false, aucune optimisation contre la distraction n'est requise, et une application peut exécuter n'importe quelle activité en toute sécurité.

Si une optimisation est nécessaire, utilisez l'API getActiveRestrictions() pour obtenir l'ensemble des restrictions en place. Cette API renvoie un entier, qui est un masque de bits de toutes les restrictions actuellement en vigueur. L'ensemble des restrictions actuellement notifiées est listé sous CarUxRestrictions.

Remarque:Des modifications mineures de l'ensemble de restrictions devraient intervenir prochainement.

Par exemple, si une application souhaite déterminer si une restriction de lecture de vidéo existe, elle doit vérifier la restriction lors de l'obtention de l'objet CarUxRestrictions:

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

DrivingState

CarDrivingStateManager présente l'état de conduite réel du véhicule (Garé, Au ralenti ou En mouvement). Les API CarDrivingStateManager peuvent être appelées de la même manière que CarUxRestrictionsManager. Les applications peuvent enregistrer un écouteur ou obtenir l'état de conduite actuel. L'état de conduite est renvoyé sous la forme CarDrivingStateEvent.

CarDrivingStateEvent.

change, la méthode onDrivingStateChanged() est appelée avec le nouveau CarDrivingStateEvent.

import android.car.Car;
/* For CarDrivingState */
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;

mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
       Car.CAR_DRIVING_STATE_SERVICE);
/* Register the listener (implemented below) */
mDrivingStateManager.registerListener(mDrivingStateEventListener);
/* While we wait for a change to be notified, query the current state */
mDrivingStateEvent = mDrivingStateManager.getCurrentCarDrivingState();

private final CarDrivingStateManager.CarDrivingStateEventListener
mDrivingStateEventListener =
       new CarDrivingStateManager.CarDrivingStateEventListener() {
   @Override
   public void onDrivingStateChanged(CarDrivingStateEvent event) {
       mDrivingStateEvent = event;
       /* handle the state change accordingly */
       handleDrivingStateChange();
   }
};

Tests

Vous pouvez imiter le changement de vitesse et de vitesse pour modifier l'état de conduite. Utilisez une commande shell ADB pour injecter des événements de véhicule. Cela peut être utile pour le développement et les tests.

Pour simuler des événements de conduite:

  1. Pour définir la vitesse sur 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Pour définir la vitesse sur "Parked" (pour simuler un CarDrivingStateEvent pointant vers PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Pour définir la vitesse sur "Drive" (conduite), tout en maintenant la vitesse à 0 (pour simuler CarDrivingStateEvent pointant vers "IDLING"):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
  4. Pour définir la vitesse sur 30 mètres par seconde (pour simuler un CarDrivingStateEvent pointant vers MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30