使用車輛駕駛狀態和使用者體驗限制功能

本頁面說明應用程式該如何妥善轉換成乾擾元素 最佳化 (DO) 使用者介面。它會說明如何使用汽車的駕駛狀態,以及 對應的使用者體驗限制 如要進一步瞭解車輛使用者體驗 (UX) 限制,請參閱 車輛使用者體驗限制, 當中詳細列出「已停妥」、「閒置」和「移動」的三種駕駛狀態。

目標對象

本課程專為想設計符合 車輛的行駛狀態,以及對應的使用者體驗限制。

技術詳細資料

開車狀態管理員

車輛的行車狀態 (停車、閒置或移動) 是根據以下項目提供的感應器值得出: 車輛硬體抽象層 (VHAL)。基本感應器資訊,例如車速和 目前的齒輪選擇,用來衍生車輛目前的行車狀態。

CarDrivingStateEvent

提供的 @SystemApis,代表只有平台內部、隨附 APK (例如 SysUI,或是 和權限 APK (例如) GMSCore 可存取 API。API 會受 駕駛狀態 android.car.permission.CAR_DRIVING_STATE 的專屬權限。客戶 如果應用程式需要存取行車狀態資訊,必須要求這項權限。

CarUxRestrictionsManager

如果這些應用程式顯示的使用者介面依行車狀態而異,則必須監聽 CarUxRestrictionsManager, 這項工具可將行車狀態對應至使用者體驗限制 ,以配合不同的市場安全需求調整。

注意:這些活動必須標示為 「焦點」步驟經過最佳化處理 ,請參閱駕駛人分心等級指南。 如果活動未標示為相應,系統將會封鎖這些活動。

而是會監控 CarUxRestrictionsManager 所公開的限制,而不是 任何與使用者相關的內容,CarDrivingStateManager 公開的絕對行車狀態 或使用者體驗

程式碼範例

以下程式碼範例說明應用程式如何監控使用者體驗限制:

  1. 匯入車輛程式庫套件:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. 導入CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener)。這個事件監聽器在註冊使用 當使用者體驗限制有所變更時,就會呼叫 CarUxRestrictionsManager 會發生什麼事視需要處理分心因素的限制變更:
    @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. 如要註冊上述步驟 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());

CarUx 限制

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

駕駛狀態

CarVehicleStateManager 會顯示車輛的實際行車狀態 (停車、閒置或 移動)。呼叫 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 公尺 (模擬 CardriveStateEvent 指向 MOVING 的情況):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30