本頁面說明應用程式該如何妥善轉換成乾擾元素 最佳化 (DO) 使用者介面。它會說明如何使用汽車的駕駛狀態,以及 對應的使用者體驗限制 如要進一步瞭解車輛使用者體驗 (UX) 限制,請參閱 車輛使用者體驗限制, 當中詳細列出「已停妥」、「閒置」和「移動」的三種駕駛狀態。
目標對象
本課程專為想設計符合 車輛的行駛狀態,以及對應的使用者體驗限制。
技術詳細資料
開車狀態管理員
車輛的行車狀態 (停車、閒置或移動) 是根據以下項目提供的感應器值得出: 車輛硬體抽象層 (VHAL)。基本感應器資訊,例如車速和 目前的齒輪選擇,用來衍生車輛目前的行車狀態。
CarDrivingStateEvent
。
提供的 @SystemApis,代表只有平台內部、隨附 APK (例如 SysUI,或是
和權限 APK (例如) GMSCore 可存取 API。API 會受
駕駛狀態 android.car.permission.CAR_DRIVING_STATE
的專屬權限。客戶
如果應用程式需要存取行車狀態資訊,必須要求這項權限。
CarUxRestrictionsManager
如果這些應用程式顯示的使用者介面依行車狀態而異,則必須監聽
CarUxRestrictionsManager
,
這項工具可將行車狀態對應至使用者體驗限制
,以配合不同的市場安全需求調整。
注意:這些活動必須標示為 「焦點」步驟經過最佳化處理 ,請參閱駕駛人分心等級指南。 如果活動未標示為相應,系統將會封鎖這些活動。
而是會監控 CarUxRestrictionsManager 所公開的限制,而不是 任何與使用者相關的內容,CarDrivingStateManager 公開的絕對行車狀態 或使用者體驗
程式碼範例
以下程式碼範例說明應用程式如何監控使用者體驗限制:
- 匯入車輛程式庫套件:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- 導入
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); } };
- 呼叫 Car API 建立名稱為 mCar 的車輛執行個體,並連線至汽車服務:
mCar = Car.createCar(context); if (mCar == null) { // handle car connection error }
- 呼叫
mCar.getCarManager() - mCarUxRestrictionsManager
即可取得CarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- 如要註冊上述步驟 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 物件提供兩種類型的資訊:
- 目前是否有最佳化干擾元素的需求?
- 如果有,目前有哪些限制?
如果 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 殼層 插入車輛事件的指令這在開發和測試時相當實用。
如何模擬行車事件:
- 如要將速度設為 0,請按照下列步驟操作:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- 如何將齒輪設為「已存放」(用於模擬指向 PARKED 的 CarDrivingStateEvent):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- 如要將齒輪設為雲端硬碟,但速度仍為 0 (可模擬 CarDrivingStateEvent 指向
重新導向至 IDLING):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- 如要將速度設為每秒 30 公尺 (模擬 CardriveStateEvent 指向 MOVING 的情況):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30