Mengkonsumsi Status Mengemudi Mobil dan Pembatasan UX

Artikel ini menjelaskan bagaimana aplikasi dapat bertransisi dengan lancar ke antarmuka pengguna Distraction Optimized (DO). Ini menjelaskan cara mengkonsumsi kondisi mengemudi mobil serta pembatasan pengalaman pengguna yang sesuai. Untuk informasi lebih lanjut tentang aturan Pembatasan Pengalaman Pengguna Mobil (UX), lihat Pembatasan Pengalaman Pengguna Mobil , yang merinci tiga status mengemudi dari Parkir, Pemalasan, dan Bergerak.

Hadirin

Konten ini disediakan bagi mereka yang ingin merancang aplikasi yang beradaptasi dengan perubahan kondisi mengemudi mobil dan pembatasan UX yang diberlakukan.

Detail Teknis

Manajer Negara Mengemudi Car

Status mengemudi mobil (Parked, Idling, atau Moving) diturunkan dari nilai sensor yang disediakan oleh Vehicle Hardware Abstraction Layer (VHAL). Informasi sensor dasar, seperti kecepatan kendaraan dan pemilihan gigi saat ini, digunakan untuk memperoleh status mengemudi kendaraan saat ini.

Informasi ini diekspos ke klien istimewa melalui CarDrivingStateManager , yang menyediakan @SystemApis, yang berarti bahwa hanya Platform Internal, Bundel APK (seperti SysUI atau Settings), dan APK Privileged (seperti) GMSCore yang dapat mengakses API. API dilindungi oleh izin khusus untuk status mengemudi android.car.permission.CAR_DRIVING_STATE . Klien yang memerlukan akses ke informasi status mengemudi harus meminta izin ini.

Manajer Pembatasan CarUx

Aplikasi yang menampilkan antarmuka pengguna yang bergantung pada status mengemudi harus mendengarkan CarUxRestrictionsManager , yang mengabstraksi pemetaan dari status mengemudi ke pembatasan UX sehingga aplikasi tidak perlu menyesuaikan dengan persyaratan keamanan pasar yang berbeda.

Catatan : Aktivitas ini harus ditandai sebagai DistractionOptimized, seperti yang dijelaskan dalam Panduan Pengalihan Pengemudi . Jika aktivitas tidak ditandai dengan tepat, aktivitas tersebut akan diblokir.

Sebagai gantinya, aplikasi memantau batasan yang diekspos oleh CarUxRestrictionsManager dan bukan status mengemudi absolut yang diekspos oleh CarDrivingStateManager untuk apa pun yang terkait dengan antarmuka pengguna atau pengalaman pengguna.

Contoh Kode

Kode contoh berikut mengilustrasikan cara aplikasi memantau pembatasan UX:

  1. Impor paket perpustakaan mobil:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Terapkan CarUxRestrictionManager.OnUxRestrictionsChangedListener ( mUxRChangeListener ). Listener ini, setelah terdaftar di CarUxRestrictionsManager , akan dipanggil saat terjadi perubahan pada batasan UX. Tangani perubahan pembatasan menjadi Distraksi Dioptimalkan, sesuai kebutuhan:
    @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. Panggil API mobil untuk membuat instance mobil bernama mCar dan sambungkan ke layanan mobil:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Panggil mCar.getCarManager() - mCarUxRestrictionsManager untuk mendapatkan CarUxRestrictionsManager : l10n
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Untuk mendaftarkan mUxRChangeListener diimplementasikan pada Langkah 2 di atas dengan panggilan CarUxRestrictionsManager mCarUxRestrictionsManager.registerListener() :
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Blok kode sampel yang telah selesai (dibuat pada Langkah 3 hingga Langkah 5) menghasilkan listener yang menerima perubahan batasan saat status drive berubah:

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

Pembatasan CarUx

Objek CarUxRestrictions menyediakan dua jenis informasi:

  1. Apakah ada persyaratan saat ini untuk Distraction Optimized?
  2. Jika ya, batasan apa yang saat ini berlaku?

Setelah CarUxRestrictions diperoleh dari getCurrentUxRestrictions() atau callback listener, aplikasi sekarang dapat menggunakan API isRequiresDistractionOptimization() untuk menentukan apakah Distraction Optimized diperlukan. Jika ini mengembalikan false, tidak ada persyaratan untuk Distraction Optimized dan aplikasi dapat menjalankan aktivitas apa pun dengan aman.

Jika pengoptimalan diperlukan, gunakan getActiveRestrictions() API untuk mendapatkan kumpulan batasan yang berlaku. API ini mengembalikan int, yang merupakan topeng kecil dari semua batasan yang saat ini berlaku. Kumpulan batasan yang saat ini diberitahukan terdaftar di bawah CarUxRestrictions .

Catatan : Perubahan kecil pada rangkaian pembatasan diperkirakan akan terjadi dalam waktu dekat.

Misalnya, jika aplikasi ingin menentukan apakah ada pembatasan untuk memutar video, setelah mendapatkan objek CarUxRestrictions, aplikasi harus memeriksa pembatasan:

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

Mengemudi

CarDrivingStateManager menyajikan keadaan mengemudi kendaraan yang sebenarnya (Parked, Idling, atau Moving). CarDrivingStateManager API bisa disebut mirip dengan CarUxRestrictionsManager. Aplikasi dapat mendaftarkan pendengar dan/atau mendapatkan status mengemudi saat ini. Status mengemudi dikembalikan sebagai CarDrivingStateEvent.

Mirip dengan CarUxRestrictionsManager API, klien dapat mendaftarkan listener untuk status mengemudi menggunakan registerListener() dan meneruskan implementasi CarDrivingStateEventListener . Pada perubahan status mengemudi, metode onDrivingStateChanged() akan dipanggil dengan CarDrivingStateEvent baru.

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

Pengujian

Anda dapat meniru pergantian gigi dan kecepatan untuk mengubah status mengemudi. Gunakan perintah shell ADB untuk menyuntikkan peristiwa kendaraan. Ini bisa menjadi pengembangan dan pengujian yang berguna.

Untuk mensimulasikan peristiwa mengemudi:

  1. Untuk mengatur kecepatan ke 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
    
  2. Untuk mengatur gigi ke Parkir (untuk mensimulasikan CarDrivingStateEvent menunjuk ke PARKED):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
    
  3. Untuk menyetel gigi ke Drive, dengan kecepatan masih 0 (untuk mensimulasikan CarDrivingStateEvent menunjuk ke IDLING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 8
    
  4. Untuk menyetel kecepatan ke 30 meter per detik (untuk mensimulasikan CarDrivingStateEvent menunjuk ke MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30