아래 내용을 읽기 전에 운전자 주의 분산 행동 제한 가이드라인을 검토하세요.
이 문서에서는 자동차 사용자 환경(UX) 제한 규칙을 설명합니다. 사용자는 이 규칙을 사용하여 여러 UX 제한 규칙 구성을 만들고(예: 유럽 연합 및 일본의 UX 제한 규칙 구성), 실행 시 어떤 규칙을 적용할지 결정할 수 있습니다. 자세한 내용은 CarUxRestrictions를 참고하세요.
자동차 UX 제한 서비스를 사용하면 개발자가 새로운 자동차 UX 제한 구성을 정의할 수 있습니다. 개발자가 제한 규칙을 수정해야 하는 경우(예: 지역 안전 표준 준수), 개발자는 API를 사용하여 새로운 구성을 정의할 수 있습니다.
구성을 설정하는 API는 새 구성에서만 유지됩니다. 즉, 이 구성이 즉시 적용되는 것은 아닙니다. 대신, UX 제한 서비스가 다시 시작되고 동시에 자동차가 주차 중이면 새 구성이 로드됩니다. 자동차 서비스는 새 구성을 다시 로드하기 전에 자동차가 주차 중인지 확인합니다.
새 UX 제한 서비스 방법 외에 구성을 생성할 수 있도록 API가 제공됩니다. 기어 선택 상태 및 속도는 다음의 세 가지 주행 상태 중 하나로 전환됩니다.
- 주차. 기어가 주차 상태에 있음.
- 유휴. 기어는 주차 상태가 아니며 속도는 0임.
- 주행. 기어는 주차 상태가 아니며 속도는 0이 아님.
애플리케이션에서 자동차의 주행 상태와 이에 대응하는 UX 제한을 어떻게 사용하는지 알아보려면 자동차 주행 상태 및 UX 제한 사용을 참고하세요.
주행 상태에 따른 제한 구성
운전자 주의 분산 행동을 방지하기 위해 Android는 주행 상태를 UX 제한 규칙에 매핑합니다(제한 목록은 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>
다중 디스플레이를 위한 구성
기본적으로 추가 디스플레이에는 제한이 적용되지 않습니다. 여러 디스플레이에 적용되는 제한 구성을 만들려면 제한을 적용하려는 디스플레이의 physicalPort와 함께 RestrictionMapping
태그를 포함합니다. 각 디스플레이에 적절한 제한이 자동으로 적용됩니다. 다음 예에서 물리적 포트 ID로 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과 같이 선택할 수 있습니다. 다음 예에서는 default와 passenger 모드에 서로 다른 제한이 구성되어 있습니다(이전에는 passenger 모드만 지원됨).
<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를 사용하여 모드의 문자열 이름을 설정할 수 있습니다. CarUxRestrictionsManager의
setRestrictionMode(@NonNull String mode)
메서드를 예로 들 수 있습니다.
(이전에는 CarUxRestrictionsManager의 setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode)
메서드를 사용했습니다.)
CarUxRestrictionsConfiguration API
CarUxRestrictionsConfiguration을 사용한 제한
새 클래스 CarUxRestrictionsConfiguration
은 현재 XML 구성 스키마에 1:1로 매핑됩니다. CarUxRestrictionsConfiguration
은 CarUxRestrictions.
로 생성할 수 있으며, 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();
CarUxRestrictionsManager API
다음 주행을 위해 CarUxRestrictionsManager
로 CarUxRestrictionsConfiguration
을 설정합니다. 이 메서드에는 Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION
권한이 필요합니다.
public synchronized boolean saveUxRestrictionsConfigurationForNextBoot( CarUxRestrictionsConfiguration config);
새 UX 제한 구성 유지
새 구성이 전달되면 UX 제한 서비스는 부울을 반환하여 새 구성이 성공적으로 저장되었는지 표시합니다. 이 새로운 구성은 통합 헤드 단위(IHU)가 다시 시작되고 자동차가 주차된 경우에만 사용됩니다. 내부적으로 UX 제한 서비스에는 두 가지 구성 집합이 있습니다.
- Production. 이 설정은 선택사항이지만 자주 사용됩니다. UX 제한 서비스는 시작 시 이 구성을 읽습니다.
- Staged. 이 구성 또한 선택사항이며 UX 제한에 영향이 없습니다. 자동차 서비스가 시작하고 자동차가 주차 중일 때 Production 구성으로 승급됩니다.
그림 1. 프로덕션 구성
실패 처리
CarPropertyManager에서 주행 상태 정보를 수신할 때까지(예: 부팅 중) UX 제한이 적용되지 않습니다. 시스템은 주행 상태가 주차 중인 것처럼 작동합니다.
저장된 구성 읽기에 실패하면(예: SettingNotFoundException 발생), UX 제한 서비스는 하드 코딩된 전체 제한 모드로 대체됩니다.
// Idling/moving state is fully restricted. private static CarUxRestrictionsConfiguration generateDefaultConfig() {}
주행 상태 및 사용자 제한
다음 콘텐츠는 아래 디자인 다이어그램에 표시된 상호작용을 설명합니다.
그림 2. 주행 상태 상호작용
주행 상태 파악에 사용되는 속성
다음 세 가지 VehiclePropertyIds
속성을 사용하여 주행 상태를 가져올 수 있습니다.
앱에서 사용할 수 있는 API
코드 위치는 다음과 같습니다.
주행 상태를 시뮬레이션하려면 테스트를 참고하세요.