運転状態と UX 制限の利用

このページでは、集中を妨げるアプリへのスムーズな移行方法について説明します。 ユーザーインターフェースが最適化されていますまた、自動車の運転状態と、それに対応するユーザー エクスペリエンスの制限を利用する方法も説明します。自動車ユーザー エクスペリエンス(UX)の制限について詳しくは、以下をご覧ください。 自動車ユーザー エクスペリエンス制限 3 つの運転状態(駐車、アイドリング、移動)の詳細が表示されています。

対象読者

このコンテンツは、環境の変化に適応するアプリを設計する 車の運転状態とそれに応じて課せられる UX 制限。

詳細な技術情報

CardrivingStateManager

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

CarDrivingStateEvent

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

CarUxRestrictionsManager

運転状態に応じてユーザー インターフェースを表示するアプリは、リッスンする必要がある CarUxRestrictionsManager, 運転状態から UX 制限へのマッピングが抽象化されるため、アプリで さまざまな市場の安全要件に合わせて調整できます。

: これらのアクティビティは、次のようにマークする必要があります。 注意散漫防止の最適化済み ドライバーの注意散漫に関するガイドラインをご覧ください。 適切にマークされていないアクティビティはブロックされます。

代わりに、アプリは CarUxRestrictionsManager によって公開された制限を監視し、 ユーザーに関連するすべてのものに対して CarDrivingStateManager によって公開される絶対運転状態 ユーザーエクスペリエンスを損ねます

コードサンプル

次のサンプルコードは、アプリが UX の制限を監視する方法を示しています。

  1. Car ライブラリ パッケージをインポートします。
    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 オブジェクトから次の 2 種類の情報が提供されます。

  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 は、車両の実際の運転状態(駐車、アイドリング、移動)を示します。CarUxRestrictionsManager の呼び出しと同様に、CarDrivingStateManager API を呼び出すことができます。アプリは、リスナーの登録や、現在の運転状態の取得を行えます。運転状態は 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();
   }
};

テスト

ギアと速度の変化をシミュレートすることで、運転状態を変えることができます。車両イベントを挿入するには、adbshell コマンドを使用します。このコマンドは開発とテストに役立ちます。

運転イベントをシミュレートするには、次のようにします。

  1. 速度を 0 に設定するには、次のようにします。
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. ギアを「Parked」に設定するには(「PARKED」を指す CarDrivingStateEvent をシミュレートする)、次のようにします。
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. 速度が 0 のままでギアを「Drive」に設定する(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