Прежде чем продолжить, ознакомьтесь с рекомендациями по отвлечению внимания за рулем .
В этой статье описываются правила ограничений взаимодействия с пользователем (UX), которые можно использовать для создания нескольких конфигураций правил ограничений UX (например, Европейский союз или Япония), а затем определить, какой набор правил следует применять во время выполнения. Дополнительные сведения см. в разделе CarUxRestrictions .
Служба Car UX Restrictions позволяет разработчикам определить новую конфигурацию Car UX Restrictions. Если разработчик хочет изменить правила ограничения (например, для соответствия местным стандартам безопасности), разработчик может использовать API для определения новой конфигурации.
API для установки конфигурации сохраняется только в новой конфигурации. Другими словами, конфигурация не вступает в силу немедленно. Вместо этого новая конфигурация загружается при перезапуске службы UX Restrictions и припарковывании автомобиля. Автосервис гарантирует, что автомобиль находится в парке перед повторной загрузкой новой конфигурации.
В дополнение к новому сервисному методу UX Restrictions для построения конфигурации предоставляются API. Состояние выбора передачи и скорости преобразуется в одно из трех состояний движения:
- Припаркован . Шестерня в парке.
- Холостой ход Передача не в паркинге и скорость нулевая.
- Переезд . Передача не в паркинге и скорость не нулевая.
Чтобы узнать, как приложения используют состояние вождения автомобиля и соответствующие ограничения UX, см. раздел Использование состояния вождения автомобиля и ограничения UX .
Конфигурация ограничений на основе состояний диска
Чтобы не отвлекать водителя, Android сопоставляет состояние вождения с набором правил ограничения UX (UX Restriction) (список ограничений см. в attrs.xml ). Рассмотрим эти примерные правила:
- Припаркован . Без ограничений.
- Холостой ход Нет видео и нет экрана конфигурации.
- Переезд . Полностью ограничено (требуются все ограничения).
Проиллюстрированное выше сопоставление предопределено и сконфигурировано как ресурс XML. Конфигурация записывается в car_ux_restrictions_map . Внутренне CarUxRestrictionsManagerService анализирует правила во время инициализации, а затем сохраняет правила в памяти. Затем служба сопоставляет текущее состояние вождения с ограничениями UX и транслирует текущие ограничения на всю систему.
<!-- No restrictions when car is parked --> <DrivingState car:state="parked"> <Restrictions car:requiresDistractionOptimization="false" car:uxr="baseline"/> </DrivingState> <!-- Restrictions when car is idling --> <DrivingState car:state="idling"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video|no_config"/> </DrivingState> <!-- Restrictions for speed >= 0 m/s --> <DrivingState car:state="moving" car:minSpeed="0.0"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="fully_restricted"/> </DrivingState>
Конфигурации для нескольких дисплеев
По умолчанию на дополнительные дисплеи не накладываются никакие ограничения. Чтобы создать конфигурации ограничений для нескольких дисплеев, включите тег RestrictionMapping
с физическим портом для этого дисплея. Соответствующие ограничения автоматически применяются к каждому дисплею. В следующем примере дисплеи с физическими идентификаторами портов 1 и 2 имеют разные конфигурации:
<RestrictionMapping car:physicalPort="1"> <DrivingState car:state="moving"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/> </DrivingState> </RestrictionMapping> <RestrictionMapping car:physicalPort="2"> <DrivingState car:state="moving"> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/> </DrivingState> </RestrictionMapping>
Конфигурации для режимов ограничения
Теперь вы можете выбрать любое имя для режима, например, teen . В следующем примере настраиваются разные ограничения для режима по умолчанию и пассажирского режима (ранее поддерживался только пассажирский режим:
<DrivingState car:state="idling"> <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/> <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/> </DrivingState> </Restrictions>Вы можете использовать API, чтобы установить любое строковое имя для режима. Например, метод
setRestrictionMode(@NonNull String mode)
в CarUxRestrictionsManager. (Ранее вы использовали метод setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode)
в CarUxRestrictionsManager).API конфигурации CarUxRestrictions
Ограничения с CarUxRestrictionsConfiguration
Новый класс CarUxRestrictionsConfiguration
сопоставляется 1:1 с текущей конфигурационной схемой XML. CarUxRestrictionsConfiguration
может быть создан с помощью CarUxRestrictions. Builder
, который проверяет конфигурацию при build().
new CarUxRestrictionsConfiguration.Builder() // Explicitly set restrictions for each driving state. .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED, /* requiresOptimization= */ false, /* restrictions= */ UX_RESTRICTIONS_BASELINE) .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING, true, UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP) .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING, true, UX_RESTRICTIONS_FULLY_RESTRICTED) // Set restriction parameters. .setMaxStringLength(int max) .setMaxCumulativeContentItems(int max) .setMaxContentDepth(int max) // Build a new CarUxRestrictionsConfiguration. .build();
API CarUxRestrictionsManager
Установите CarUxRestrictionsConfiguration
для следующего диска с помощью CarUxRestrictionsManager
. Этот метод требует разрешения Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION
.
public synchronized boolean saveUxRestrictionsConfigurationForNextBoot( CarUxRestrictionsConfiguration config);
Сохранение новой конфигурации ограничений UX
Когда передается новая конфигурация, служба UX Restrictions возвращает логическое значение, указывающее, успешно ли сохранена новая конфигурация. Эта новая конфигурация используется только при перезапуске интегрированного головного устройства (IHU) и припаркованном автомобиле. Внутри служба UX Restrictions содержит два набора конфигураций:
- Производство . Хотя эта конфигурация необязательна, она часто присутствует. Служба UX Restrictions считывает эту конфигурацию при запуске.
- Постановка . Также необязательная, эта конфигурация не влияет на ограничения UX и повышается до рабочей, когда начинается автосервис и когда автомобиль припаркован.
Рис. 1. Производственная конфигурация
Ошибки адреса
Пока информация о состоянии вождения не будет получена от CarPropertyManager (например, во время загрузки), ограничения UX не будут применяться. Система будет работать так, как если бы состояние вождения было припарковано.
В случае сбоя чтения сохраненной конфигурации (например, результатов SettingNotFoundException) служба UX Restrictions возвращается к жестко запрограммированному, полностью ограниченному режиму:
// Idling/moving state is fully restricted. private static CarUxRestrictionsConfiguration generateDefaultConfig() {}
Состояние вождения и ограничения пользователя
Следующее содержимое описывает взаимодействия, отображаемые на следующей схеме проекта:
Рисунок 2. Взаимодействие состояний вождения
Свойства, используемые для получения состояния вождения
Используйте следующие три VehiclePropertyIds
для определения состояния вождения:
API, доступные для приложений
Код находится в следующих местах:
Код | Расположение |
---|---|
CarUxRestrictionsManager Публичные API для регистрации изменений ограничений UX. | /packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java |
CarUxRestrictions Определение ограничений UX. | /packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarUxRestrictions.java |
CarDrivingStateManager Системные API для регистрации изменений состояния вождения. | /packages/services/Car/+/master/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java |
Чтобы смоделировать состояния вождения, см. Тестирование .