На этой странице объясняется, как приложения могут плавно переходить к пользовательским интерфейсам, оптимизированным для отвлечения внимания (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:
- Импортируйте пакеты библиотеки автомобилей:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- Реализуйте
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); } };
- Вызовите автомобильные API, чтобы создать экземпляр автомобиля с именем mCar и подключиться к автосервису:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- Вызовите
mCar.getCarManager() - mCarUxRestrictionsManager
чтобы получитьCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Чтобы зарегистрировать
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 предоставляет два типа информации:
- Есть ли в настоящее время требование оптимизировать отвлечение внимания?
- Если да, то какие ограничения действуют в настоящее время?
Когда 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 для ввода событий автомобиля. Это может быть полезно для разработки и тестирования.
Чтобы смоделировать события вождения:
- Чтобы установить скорость на 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- Чтобы установить передачу в режим «Припарковано» (чтобы имитировать событие CarDrivingStateEvent, указывающее на «PARKED»):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- Чтобы установить передачу на движение, со скоростью, все еще равной 0 (чтобы имитировать событие CarDrivingStateEvent, указывающее на ХОЛОСТОЙ ход):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- Чтобы установить скорость 30 метров в секунду (чтобы имитировать событие CarDrivingStateEvent, указывающее на ДВИЖЕНИЕ):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30