자동차 운전 상태 및 UX 제한 사용

이 문서에서는 애플리케이션을 Distraction Optimized(DO) 사용자 인터페이스로 원활하게 전환할 수 있는 방법을 설명합니다. 자동차의 운전 상태 및 상응하는 사용자 환경 제한을 사용하는 방법을 설명합니다. 자동차 사용자 환경(UX) 제한 규칙에 관한 자세한 내용은 주차, 유휴, 이동의 세 가지 운전 상태를 자세히 설명하는 자동차 사용자 환경 제한을 참고하세요.

대상

이 콘텐츠는 차량의 운전 상태 및 그에 상응하여 적용되는 UX 제한의 변화에 따라 조정되는 애플리케이션을 설계하려는 개발자를 위한 것입니다.

기술 세부정보

CarDrivingStateManager

차량의 운전 상태(주차, 유휴, 이동)는 차량 하드웨어 추상화 계층(VHAL)에서 제공하는 센서 값에서 추론합니다. 차량 속도 및 현재 기어 선택과 같은 기본 센서 정보를 사용하여 차량의 현재 운전 상태를 추론합니다.

이 정보는 @SystemApis를 제공하는 CarDrivingStateManager를 통해 권한이 있는 클라이언트에 노출됩니다. 즉, 플랫폼 내부 요소, 번들된 APK (예: SysUI 또는 설정), 권한이 있는 APK(예: GMSCore)만 API에 액세스할 수 있습니다. API는 운전 상태 android.car.permission.CAR_DRIVING_STATE와 관련된 권한으로 보호됩니다. 운전 상태 정보에 액세스해야 하는 클라이언트는 이 권한을 요청해야 합니다.

CarUxRestrictionsManager

운전 상태에 따라 사용자 인터페이스를 표시하는 애플리케이션은 CarUxRestrictionsManager를 수신하여 서로 다른 시장 안전 요구사항에 맞게 애플리케이션을 조정할 필요가 없도록 운전 상태와 UX 제한의 매핑을 추상화해야 합니다.

참고: 이러한 활동은 운전자 주의 분산 행동 가이드라인의 설명대로 반드시 DistractionOptimized로 표시해야 합니다. 이렇게 표시되지 않으면 활동이 차단됩니다.

대신 애플리케이션은 사용자 인터페이스 또는 사용자 환경과 관련된 모든 사항에 관해 CarDrivingStateManager가 노출한 절대 운전 상태가 아닌 CarUxRestrictionsManager가 노출한 제한사항을 모니터링합니다.

코드 샘플

다음 샘플 코드는 애플리케이션이 UX 제한사항을 모니터링하는 방법을 보여 줍니다.

  1. 차량 라이브러리 패키지를 가져옵니다.
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. CarUxRestrictionManager.OnUxRestrictionsChangedListener(mUxRChangeListener)를 구현합니다. 이 리스너는 CarUxRestrictionsManager에 등록된 경우 UX 제한사항에 변경이 발생하면 호출됩니다. 필요한 경우 제한사항 변경을 Distraction Optimized로 처리합니다.
    @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. 위의 2단계에서 구현된 mUxRChangeListenerCarUxRestrictionsManager에 등록하려면 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());

CarUxRestrictions

CarUxRestrictions 객체는 다음과 같은 두 유형의 정보를 제공합니다.

  1. 현재 Distraction Optimized 요구사항이 있는지
  2. 있는 경우, 현재 적용되는 제한사항

getCurrentUxRestrictions() 또는 리스너 콜백에서 CarUxRestrictions를 가져오면 애플리케이션은 isRequiresDistractionOptimization() API를 사용하여 Distraction Optimized가 필요한지 여부를 파악할 수 있습니다. false가 반환되는 경우 Distraction Optimized 요구사항이 없으며 애플리케이션이 모든 활동을 안전하게 실행할 수 있습니다.

최적화가 필요한 경우에는 getActiveRestrictions() API를 사용하여 현재의 제한사항 세트를 가져옵니다. 이 API는 현재 적용 중인 모든 제한사항의 비트 마스크인 int를 반환합니다. 현재 수신된 제한사항 세트는 CarUxRestrictions 아래에 나열됩니다.

참고: 제한사항 세트가 가까운 시일 내에 약간 변경될 예정입니다.

예를 들어 동영상 재생 제한의 존재 여부를 확인하려는 애플리케이션은 CarUxRestrictions 객체가 수신되면 제한사항을 확인해야 합니다.

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

DrivingState

CarDrivingStateManager는 차량의 실제 운전 상태(주차, 유휴, 이동)를 나타냅니다. CarDrivingStateManager API는 CarUxRestrictionsManager와 유사하게 호출할 수 있습니다. 애플리케이션은 리스너를 등록하거나 현재 운전 상태를 가져올 수 있습니다. 운전 상태가 CarDrivingStateEvent로 반환됩니다.

CarUxRestrictionsManager API와 마찬가지로 클라이언트는 registerListener()를 사용해 운전 상태 관련 리스너를 등록하고 CarDrivingStateEventListener의 구현을 전달할 수 있습니다. 운전 상태 변경 시 새 CarDrivingStateEvent를 사용하여 onDrivingStateChanged() 메서드가 호출됩니다.

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. 기어를 주차로 설정합니다(PARKED를 가리키는 CarDrivingStateEvent 시뮬레이션).
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. 속도를 여전히 0으로 두고 기어를 주행으로 설정합니다(IDLING을 가리키는 CarDrivingStateEvent 시뮬레이션).
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. 속도를 초속 30미터로 설정합니다(MOVING을 가리키는 CarDrivingStateEvent 시뮬레이션).
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30