자동차 운전 상태 및 UX 제한을 소비합니다.

이 페이지에서는 앱이 DO(주의 분산 최적화) 사용자 인터페이스로 우아하게 전환할 수 있는 방법을 설명합니다. 자동차의 주행 상태를 소비하는 방법과 그에 따른 사용자 경험 제한 사항을 설명합니다. 자동차 사용자 경험(UX) 제한에 대한 자세한 내용은 주차, 공회전 및 이동의 세 가지 운전 상태를 자세히 설명하는 자동차 사용자 경험 제한을 참조하세요.

청중

이 콘텐츠는 자동차 운전 상태의 변화와 그에 따른 UX 제한 사항에 적응하는 앱을 디자인하려는 사람들을 위해 제공됩니다.

기술적 세부 사항

자동차운전상태관리자

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

CarDrivingStateEvent .

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

자동차Ux제한사항관리자

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

참고 : 이러한 활동은 운전자 주의 분산 지침 에 설명된 대로 주의 분산 최적화로 표시되어야 합니다 . 활동이 적절하게 표시되지 않으면 차단됩니다.

대신 앱은 사용자 인터페이스 또는 사용자 경험과 관련된 모든 것에 대해 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 제한 사항이 변경될 때 호출됩니다. 필요에 따라 방해 요소가 최적화되도록 제한 변경 사항을 처리합니다.
    @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단계에서 구현된 mUxRChangeListener CarUxRestrictionsManager 호출로 등록하려면 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());

자동차Ux제한사항

CarUxRestrictions 객체는 두 가지 유형의 정보를 제공합니다.

  1. 산만함을 최적화해야 하는 현재 요구 사항이 있습니까?
  2. 그렇다면 현재 어떤 제한이 적용되고 있나요?

CarUxRestrictions가 getCurrentUxRestrictions() 또는 리스너 콜백에서 획득되면 앱은 이제 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는 차량의 실제 주행 상태(Parked, Idling 또는 Moving)를 표시합니다. CarDrivingStateManager API는 CarUxRestrictionsManager와 유사하게 호출할 수 있습니다. 앱은 청취자를 등록하거나 현재 운전 상태를 가져올 수 있습니다. 운전 상태는 CarDrivingStateEvent로 반환됩니다.

CarDrivingStateEvent .

변경되면 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으로 설정하려면(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