Учитывайте состояние вождения автомобиля и ограничения UX

На этой странице объясняется, как приложения могут плавно переходить к пользовательским интерфейсам, оптимизированным для отвлечения внимания (DO). В нем описывается, как учитывать состояние вождения автомобиля, а также соответствующие ограничения пользовательского опыта. Дополнительные сведения об ограничениях взаимодействия с пользователем автомобиля (UX) см. в разделе «Ограничения взаимодействия с пользователем автомобиля» , в котором подробно описаны три состояния вождения: «Припарковано», «Холостой ход» и «Движение».

Аудитория

Этот контент предназначен для тех, кто хочет разрабатывать приложения, которые адаптируются к изменениям режима вождения автомобиля и соответствующим ограничениям UX.

Технические детали

АвтомобильВождениеStateManager

Состояние вождения автомобиля (припарковано, на холостом ходу или в движении) определяется на основе значений датчиков, предоставляемых уровнем абстракции аппаратного обеспечения транспортного средства (VHAL). Основная информация датчиков, такая как скорость автомобиля и текущий выбор передачи, используется для определения текущего состояния движения автомобиля.

CarDrivingStateEvent .

который предоставляет @SystemApis, что означает, что только внутренние компоненты платформы, связанные APK (например, SysUI или настройки) и привилегированные APK (например,) GMSCore могут получить доступ к API. API защищены разрешениями, специфичными для состояния вождения android.car.permission.CAR_DRIVING_STATE . Клиенты, которым требуется доступ к информации о состоянии вождения, должны запросить это разрешение.

CarUxRestrictionsManager

Те приложения, которые отображают пользовательский интерфейс в зависимости от состояния вождения, должны прослушивать CarUxRestrictionsManager , который абстрагирует сопоставление состояния вождения с ограничениями UX, чтобы приложениям не приходилось подстраиваться под различные требования безопасности рынка.

Примечание . Эти действия должны быть отмечены как оптимизированные для отвлечения внимания, как описано в разделе «Рекомендации по отвлечению внимания водителя» . Если действия не отмечены соответствующим образом, они блокируются.

Вместо этого приложения отслеживают ограничения, предоставляемые CarUxRestrictionsManager, а не абсолютное состояние вождения, предоставляемое CarDrivingStateManager, на предмет всего, что связано с пользовательским интерфейсом или взаимодействием с пользователем.

Пример кода

Следующий пример кода иллюстрирует, как приложение отслеживает ограничения UX:

  1. Импортируйте пакеты библиотеки автомобилей:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Реализуйте CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). Этот прослушиватель при регистрации в CarUxRestrictionsManager вызывается при изменении ограничений UX. При необходимости обработайте изменения ограничений для оптимизации отвлечения внимания:
    @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. Вызовите автомобильные API, чтобы создать экземпляр автомобиля с именем mCar и подключиться к автосервису:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Вызовите mCar.getCarManager() - mCarUxRestrictionsManager чтобы получить CarUxRestrictionsManager :
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Чтобы зарегистрировать mUxRChangeListener , реализованный на шаге 2 выше, с помощью CarUxRestrictionsManager вызовите mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Завершенный блок примера кода (созданный на этапах с 3 по 5) приводит к тому, что прослушиватель получает изменения ограничений при изменении состояния диска:

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

CarUxОграничения

Объект CarUxRestrictions предоставляет два типа информации:

  1. Есть ли в настоящее время требование оптимизировать отвлечение внимания?
  2. Если да, то какие ограничения действуют в настоящее время?

Когда CarUxRestrictions получается из getCurrentUxRestrictions() или обратного вызова прослушивателя, приложения теперь могут использовать API isRequiresDistractionOptimization() , чтобы определить, требуется ли оптимизация отвлечения. Если это возвращает false , нет необходимости быть оптимизированным для отвлечения внимания, и приложение может безопасно выполнять любые действия.

Если требуется оптимизация, используйте API getActiveRestrictions(), чтобы получить набор действующих ограничений. Этот API возвращает int , который является битовой маской всех действующих в настоящее время ограничений. Набор ограничений, о которых в настоящее время сообщается, указан в разделе CarUxRestrictions .

Примечание. В ближайшем будущем ожидаются незначительные изменения в наборе ограничений.

Например, если приложение хочет определить, существует ли ограничение на воспроизведение видео, после получения объекта CarUxRestrictions приложение должно проверить наличие ограничения:

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

Состояние вождения

CarDrivingStateManager отображает фактическое состояние вождения автомобиля (припарковано, на холостом ходу или в движении). API CarDrivingStateManager можно вызывать аналогично CarUxRestrictionsManager. Приложения могут регистрировать прослушиватель или получать текущее состояние вождения. Состояние вождения возвращается как CarDrivingStateEvent.

CarDrivingStateEvent .

изменения, метод onDrivingStateChanged() вызывается с новым 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();
   }
};

Тестирование

Вы можете имитировать переключение передач и скорости, чтобы изменить режим вождения. Используйте команду оболочки ADB для ввода событий автомобиля. Это может быть полезно для разработки и тестирования.

Чтобы смоделировать события вождения:

  1. Чтобы установить скорость на 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Чтобы установить передачу в режим «Припарковано» (чтобы имитировать событие CarDrivingStateEvent, указывающее на «PARKED»):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Чтобы установить передачу на движение, со скоростью, все еще равной 0 (чтобы имитировать событие CarDrivingStateEvent, указывающее на ХОЛОСТОЙ ход):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. Чтобы установить скорость 30 метров в секунду (чтобы имитировать событие CarDrivingStateEvent, указывающее на ДВИЖЕНИЕ):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30