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

이 페이지에서는 앱이 주의 분산 행동으로 적절하게 전환되는 방법을 설명합니다. 최적화된 (DO) 사용자 인터페이스를 기반으로 빌드되었습니다 자동차의 운전 상태 및 상응하는 사용자 환경 제한을 사용하는 방법을 설명합니다. 자동차 사용자 환경 (UX) 제한에 관한 자세한 내용은 다음을 참고하세요. 자동차 사용자 환경 제한 세 가지 주행 상태(주차, 공회전, 이동)에 대해 자세히 설명합니다.

대상

이 콘텐츠는 그에 따라 부과되는 UX 제한을 확인할 수 있습니다.

기술 세부정보

CarDrivingStateManager

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

CarDrivingStateEvent

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

CarUxRestrictionsManager

운전 상태에 따라 사용자 인터페이스를 표시하는 앱은 CarUxRestrictionsManager, 이는 운전 상태에서 UX 제한으로의 매핑을 추상화하므로 앱이 다양한 시장 안전 요구사항에 맞게 조정할 수 있습니다

참고: 이러한 활동은 반드시 설명한 대로 주의 분산 행동 최적화 운전자 주의 분산 행동 가이드라인을 참고하세요. 활동이 적절하게 표시되지 않으면 차단됩니다.

대신 앱은 CarUxRestrictionsManager에 의해 노출된 제한을 모니터링하고 사용자와 관련된 모든 항목에 관해 CarDrivingStateManager에서 노출한 절대 운전 상태 인터페이스나 사용자 환경입니다.

코드 샘플

다음 샘플 코드는 앱이 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단계에서 구현된 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. 현재 주의 분산 행동 최적화를 위한 요구사항이 있나요?
  2. 있는 경우, 현재 적용되는 제한사항

CarUxRestrictions를 다음에서 획득한 경우 getCurrentUxRestrictions() 또는 리스너 콜백으로, 앱은 이제 isRequiresDistractionOptimization() API를 사용하여 주의 분산 행동이 있는지 확인 최적화됨 은(는) 필수입니다. false가 반환되면 주의 분산 행동이 아니어도 됩니다. 앱이 최적화되어 모든 활동을 안전하게 실행할 수 있습니다.

최적화가 필요한 경우에는 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로 반환됩니다.

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으로 두고 기어를 주행으로 설정합니다 (CarDrivingStateEvent 포인팅 시뮬레이션). IDLING으로 변경):
    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