運転状態と UX 制限の利用

このページでは、アプリが気晴らし最適化 (DO) ユーザー インターフェイスにスムーズに移行する方法について説明します。車の運転状態を消費する方法と、それに対応するユーザー エクスペリエンスの制限について説明します。車のユーザー エクスペリエンス (UX) の制限の詳細については、 「車のユーザー エクスペリエンス制限」を参照してください。ここでは、駐車、アイドリング、移動の 3 つの運転状態について詳しく説明しています。

観客

このコンテンツは、車の運転状態の変化や、それに応じて課される UX 制限に適応するアプリを設計したい人向けに提供されています。

技術的な詳細

車の運転状態マネージャー

車の運転状態 (駐車中、アイドリング中、移動中) は、Vehicle Hardware Abstraction Layer (VHAL) によって提供されるセンサー値から導出されます。車速や現在のギア選択などの基本的なセンサー情報は、車両の現在の運転状態を導き出すために使用されます。

CarDrivingStateEvent

これは @SystemApis を提供します。これは、プラットフォーム内部、バンドルされた APK (SysUI や設定など)、および特権付き APK (GMSCore など) のみが API にアクセスできることを意味します。 API は、運転状態android.car.permission.CAR_DRIVING_STATEに固有の権限によって保護されています。運転状態情報へのアクセスが必要なクライアントは、この許可を要求する必要があります。

CarUx制限マネージャー

運転状態に応じてユーザー インターフェイスを表示するアプリは、アプリがさまざまな市場の安全要件に合わせて調整する必要がないように、運転状態から 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 で実装された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());

CarUx制限事項

CarUxRestrictionsオブジェクトは、次の 2 種類の情報を提供します。

  1. 現在、気を散らすものを最適化するための要件はありますか?
  2. もしそうなら、現在どのような制限が設けられていますか?

CarUxRestrictionsgetCurrentUxRestrictions()またはリスナー コールバックのいずれかから取得される場合、アプリはisRequiresDistractionOptimization() API を使用して、Distraction Optimized が必要かどうかを判断できるようになりました。これがfalseを返した場合、注意散漫を最適化する必要はなく、アプリはあらゆるアクティビティを安全に実行できます。

最適化が必要な場合は、 getActiveRestrictions() API を使用して、設定されている一連の制限を取得します。この API は、現在有効なすべての制限のビット マスクであるintを返します。現在通知されている一連の制限は、 CarUxRestrictionsの下にリストされています。

注:一連の制限に若干の変更が近い将来行われることが予想されます。

たとえば、アプリがビデオの再生制限が存在するかどうかを確認したい場合、CarUxRestrictions オブジェクトを取得したときに、アプリはその制限を確認する必要があります。

int activeUxR = mCurrentCarUxRestrictions.getActiveRestrictions();
if ((activeUxR & CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO) != 0) {
      handleStopPlayingVideo();
}

運転状態

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. ギアをパーキングに設定するには (パーキングを指す 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