자동차 사용자 환경 제한

아래 내용을 읽기 전에 운전자 주의 분산 행동 제한 가이드라인을 검토하세요.

이 문서에서는 자동차 사용자 환경(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과 같이 선택할 수 있습니다. 다음 예에서는 defaultpassenger 모드에 서로 다른 제한이 구성되어 있습니다(이전에는 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로 매핑됩니다. CarUxRestrictionsConfigurationCarUxRestrictions.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();

CarUxRestrictionsManager API

다음 주행을 위해 CarUxRestrictionsManagerCarUxRestrictionsConfiguration을 설정합니다. 이 메서드에는 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

코드 위치는 다음과 같습니다.

코드 위치
CarUxRestrictionsManager
UX 제한 변경사항을 등록하는 데 사용하는 공개 API
/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

주행 상태를 시뮬레이션하려면 테스트를 참고하세요.