Consommation de l'état de conduite automobile et restrictions UX

Cette page explique comment les applications peuvent passer en douceur vers des interfaces utilisateur optimisées pour la distraction (DO). Il décrit comment consommer l'état de conduite d'une voiture ainsi que les restrictions correspondantes en matière d'expérience utilisateur. Pour plus d'informations sur les restrictions de l'expérience utilisateur de la voiture (UX), consultez Restrictions de l'expérience utilisateur de la voiture , qui détaille les trois états de conduite : Stationné, Ralenti et En mouvement.

Public

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

Détails techniques

CarDrivingStateManager

L'état de conduite d'une voiture (Stationné, Au ralenti ou En mouvement) est dérivé des valeurs des capteurs fournies par la couche d'abstraction matérielle du véhicule (VHAL). Les informations de base du capteur, telles que la vitesse du véhicule et la sélection actuelle du rapport, sont utilisées pour déduire 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 résume le mappage de l'état de conduite aux restrictions UX 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 étant optimisées pour la distraction, comme décrit dans les lignes directrices sur la distraction 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 illustre comment une application surveille les restrictions UX :

  1. Importez les packages de la bibliothèque automobile :
    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 UX se produit. Gérez les modifications de restriction pour optimiser la distraction, 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 connectez-vous 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 CarUxRestrictionsManager appelez mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Le bloc terminé d'exemple de code (créé de l'étape 3 à l'étape 5) permet à l'auditeur 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 une exigence actuelle pour optimiser la distraction ?
  2. Si oui, quelles sont les restrictions 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 Distraction Optimized est requise. Si cela renvoie false , il n'est pas nécessaire d'être optimisé pour la distraction et une application peut exécuter n'importe quelle activité en toute sécurité.

Si une optimisation est requise, utilisez l'API getActiveRestrictions() pour obtenir l'ensemble des restrictions en place. Cette API renvoie un int , qui est un peu un masque de toutes les restrictions actuellement en vigueur. L'ensemble des restrictions actuellement notifiées est répertorié sous CarUxRestrictions .

Remarque : Des modifications mineures à l’ensemble des restrictions devraient survenir dans un avenir proche.

Par exemple, si une application souhaite déterminer s'il existe une restriction de lecture vidéo, après avoir obtenu l'objet CarUxRestrictions, l'application doit vérifier la restriction :

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

État de conduite

CarDrivingStateManager présente l'état de conduite réel du véhicule (stationné, ralenti ou en mouvement). Les API CarDrivingStateManager peuvent être appelées de manière similaire à CarUxRestrictionsManager. Les applications peuvent enregistrer un auditeur 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();
   }
};

Essai

Vous pouvez imiter le changement de vitesse et de vitesse pour changer 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 régler la vitesse à 0 :
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Pour régler le rapport sur Parked (pour simuler CarDrivingStateEvent pointant vers PARKED) :
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Pour mettre le rapport sur Drive, avec la vitesse toujours à 0 (pour simuler CarDrivingStateEvent pointant vers IDLING) :
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. Pour régler la vitesse à 30 mètres par seconde (pour simuler CarDrivingStateEvent pointant vers MOVING) :
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30