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

Cette page explique comment les applications peuvent passer en douceur à la distraction optimisées. Il décrit comment consommer le temps de conduite d'une voiture et l'état les restrictions correspondantes sur l'expérience utilisateur. Pour en savoir plus sur les restrictions liées à l'expérience utilisateur de la voiture, consultez Restrictions liées à l'expérience utilisateur dans la voiture qui détaille les trois états de conduite : à l'arrêt, à l'arrêt et en mouvement.

Audience

Ce contenu est destiné à ceux qui souhaitent concevoir des applications qui s'adaptent aux changements d'un l'état de conduite de la voiture et les restrictions UX correspondantes imposées.

Détails techniques

Gestionnaire d'état de conduite

L'état de conduite d'une voiture (en stationnement, inactif ou en mouvement) est calculé à partir des valeurs des capteurs fournies par la couche d'abstraction matérielle du véhicule (VHAL). Informations de base sur les capteurs, telles que la vitesse du véhicule et la sélection actuelle des vitesses, est utilisée pour déterminer l'état de conduite actuel du véhicule.

CarDrivingStateEvent.

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

Gestionnaire de restrictions CarUx

Les applications qui affichent une interface utilisateur qui dépend de l'état de conduite doivent écouter CarUxRestrictionsManager, ce qui élimine le mappage entre l'état de conduite et les restrictions de l'expérience utilisateur, afin que les applications n'aient pas à s'adapter aux différentes exigences de sécurité du marché.

Remarque: Ces activités doivent être marquées comme optimisée pour la distraction, comme décrit dans les Consignes concernant la distraction des conducteurs. 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'utilisateur l'interface ou l'expérience utilisateur.

Exemple de code

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

  1. Importez les packages de la bibliothèque voiture:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Implémenter CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Cet écouteur, lorsqu'il est enregistré auprès de la fonction CarUxRestrictionsManager, est appelé lorsqu'une modification des restrictions de l'expérience utilisateur se produit. Gérez les modifications des restrictions 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 car pour créer une instance de voiture nommée "mCar" et vous connecter au service car:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Appelez mCar.getCarManager() - mCarUxRestrictionsManager pour obtenir la CarUxRestrictionsManager:
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Pour enregistrer mUxRChangeListener implémenté à l'étape 2 ci-dessus avec la Appel CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Le bloc terminé d'échantillon de code (créé aux étapes 3 à 5) génère l'écouteur recevoir des modifications de restriction lorsque l'état du disque 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 pour optimiser la distraction ?
  2. Si oui, quelles sont les restrictions en vigueur ?

Lorsque CarUxRestrictions est obtenu auprès de l'un des getCurrentUxRestrictions() ou le rappel de l'écouteur, les applications peuvent désormais utiliser l'API isRequiresDistractionOptimization() pour déterminer si Distraction Optimisé est obligatoire. Si la valeur false est renvoyée, il n'est pas nécessaire d'indiquer "Distraction". Optimisée, l'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. Ce L'API renvoie un int, qui est un masque de bits de toutes les restrictions en vigueur. La ensemble de restrictions actuellement notifiées est répertorié sous CarUxRestrictions.

Remarque:Des modifications mineures de l'ensemble de restrictions sont prévues se produisent dans un avenir proche.

Par exemple, si une application souhaite déterminer si la lecture de vidéos est soumise à une restriction, obtenant 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 la conduite

CarDrivingStateManager indique l'état de conduite réel du véhicule (en stationnement, en veille ou En cours de déplacement). 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é. en tant que 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 simuler les changements de vitesse et de vitesse pour changer l'état de conduite. Utiliser un 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 mettre l'équipement à l'arrêt (afin de simuler l'événement CarDrivingStateEvent pointant vers PARKED), procédez comme suit :
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Pour mettre les vitesses en mode Conduite, avec une vitesse toujours à 0 (pour simuler un pointage CarDrivingStateEvent à 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 (afin de simuler la fonction CarDrivingStateEvent pointant vers MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30