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

이 문서에서는 애플리케이션이 Distraction Optimized(DO) 사용자 인터페이스로 원활하게 전환할 수 있는 방법을 설명합니다. 자동차의 운전 상태와 해당 사용자 경험 제한을 소비하는 방법을 설명합니다. 자동차 사용자 경험(UX) 제한 규칙에 대한 자세한 내용은 주차, 공회전 및 이동의 세 가지 운전 상태를 자세히 설명하는 자동차 사용자 경험 제한 을 참조하십시오.

청중

이 콘텐츠는 자동차의 운전 상태 및 그에 따라 부과되는 UX 제한의 변화에 ​​적응하는 애플리케이션을 설계하려는 사람들을 위해 제공됩니다.

기술적 세부 사항

CarDrivingStateManager

자동차의 운전 상태(주차, 공회전 또는 이동 중)는 VHAL(차량 하드웨어 추상화 계층)에서 제공하는 센서 값에서 파생됩니다. 차량 속도 및 현재 기어 선택과 같은 기본 센서 정보는 차량의 현재 주행 상태를 도출하는 데 사용됩니다.

이 정보는 CarDrivingStateManager 를 제공하는 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. car 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. CarUxRestrictionsManager 를 호출하여 위의 2단계에서 구현된 mUxRChangeListener 를 등록하려면 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 개체는 두 가지 유형의 정보를 제공합니다.

  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();
}

드라이빙 스테이트

CarDrivingStateManager는 차량의 실제 운전 상태(주차, 공회전 또는 이동 중)를 나타냅니다. CarDrivingStateManager API는 CarUxRestrictionsManager와 유사하게 호출할 수 있습니다. 응용 프로그램은 수신기를 등록하거나 현재 운전 상태를 가져올 수 있습니다. 운전 상태는 CarDrivingStateEvent로 반환됩니다.

CarUxRestrictionsManager API와 유사하게 클라이언트는 registerListener() 를 사용하여 운전 상태에 대한 리스너를 등록하고 CarDrivingStateEventListener 구현을 전달할 수 있습니다. 운전 상태가 변경되면 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 셸 명령을 사용하여 차량 이벤트를 주입합니다. 이것은 유용한 개발 및 테스트가 될 수 있습니다.

운전 이벤트를 시뮬레이션하려면:

  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인 상태에서 기어를 Drive로 설정하려면(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