この記事では、アプリケーションがDistraction Optimized(DO)ユーザーインターフェイスに適切に移行する方法について説明します。車の運転状態を消費する方法と、それに対応するユーザーエクスペリエンスの制限について説明します。カーユーザーエクスペリエンス(UX)制限ルールの詳細については、「カーユーザーエクスペリエンスの制限」を参照してください。これには、駐車、アイドリング、および移動の3つの運転状態の詳細が記載されています。
観客
このコンテンツは、車の運転状態の変化とそれに対応して課せられるUX制限に適応するアプリケーションを設計したい人のために提供されています。
技術的な詳細
CarDrivingStateManager
車の運転状態(駐車、アイドリング、または移動)は、Vehicle Hardware Abstraction Layer(VHAL)によって提供されるセンサー値から導出されます。車速や現在のギア選択などの基本的なセンサー情報は、車両の現在の運転状態を導き出すために使用されます。
この情報は、@ SystemApisを提供するCarDrivingStateManager
によって特権クライアントに公開されます。つまり、プラットフォーム内部、バンドルAPK(SysUIや設定など)、および特権APK(GMSCoreなど)のみがAPIにアクセスできます。 APIは、運転状態android.car.permission.CAR_DRIVING_STATE
に固有の権限によって保護されています。運転状態情報へのアクセスを必要とするクライアントは、この許可を要求する必要があります。
CarUxRestrictionsManager
運転状態に依存するユーザーインターフェイスを表示するアプリケーションは、 CarUxRestrictionsManager
をリッスンする必要があります。これにより、運転状態からUX制限へのマッピングが抽象化され、アプリケーションはさまざまな市場の安全要件に合わせて調整する必要がなくなります。
注:これらのアクティビティは、ドライバーの注意散漫ガイドラインで説明されているように、注意散漫最適化としてマークする必要があります。アクティビティが適切にマークされていない場合、それらはブロックされます。
代わりに、アプリケーションは、CarUxRestrictionsManagerによって公開される制限を監視し、CarDrivingStateManagerによって公開される絶対的な運転状態ではなく、ユーザーインターフェイスまたはユーザーエクスペリエンスに関連するものを監視します。
コードサンプル
次のサンプルコードは、アプリケーションがUX制限を監視する方法を示しています。
- 車のライブラリパッケージをインポートします:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
-
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); } };
- 車の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に登録するには、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());
CarUxRestrictions
CarUxRestrictionsオブジェクトは、次の2種類の情報を提供します。
- 気晴らしを最適化するための現在の要件はありますか?
- もしそうなら、現在どのような制限がありますか?
CarUxRestrictionsがgetCurrentUxRestrictions()
またはリスナーコールバックのいずれかから取得されると、アプリケーションはisRequiresDistractionOptimization()
APIを使用して、DistractionOptimizedが必要かどうかを判断できるようになります。これが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として返されます。
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シェルコマンドを使用して、車両イベントを挿入します。これは、開発とテストに役立ちます。
運転イベントをシミュレートするには:
- 速度を0に設定するには:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- ギアをParkedに設定するには(PARKEDを指すCarDrivingStateEventをシミュレートするには):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
- 速度を0のままにしてギアをドライブに設定するには(IDLINGを指すCarDrivingStateEventをシミュレートするため):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
- 速度を毎秒30メートルに設定するには(MOVINGを指すCarDrivingStateEventをシミュレートするため):
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30