Konsumsi status mengemudi mobil dan pembatasan UX

Halaman ini menjelaskan bagaimana aplikasi dapat bertransisi dengan baik ke antarmuka pengguna yang dioptimalkan untuk gangguan (DO). Ini menjelaskan cara menggunakan status mengemudi mobil serta batasan pengalaman pengguna yang sesuai. Untuk informasi lebih lanjut tentang pembatasan Pengalaman Pengguna Mobil (UX), lihat Pembatasan Pengalaman Pengguna Mobil , yang merinci tiga status mengemudi yaitu Parkir, Idling, 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 Status Mengemudi Mobil

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

CarDrivingStateEvent .

yang menyediakan @SystemApis, artinya hanya Platform Internal, APK yang Dibundel (seperti SysUI atau Pengaturan), dan APK Istimewa (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 MobilUx

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 gangguan yang dioptimalkan, seperti yang dijelaskan dalam Pedoman gangguan pengemudi . Jika aktivitas tidak ditandai dengan benar, aktivitas tersebut diblokir.

Sebaliknya, aplikasi memantau pembatasan 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, ketika terdaftar dengan CarUxRestrictionsManager , dipanggil ketika terjadi perubahan pada pembatasan UX. Tangani perubahan pembatasan agar gangguan 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 terhubung ke layanan mobil:
    mCar = Car.createCar(context);
    if (mCar == null) {
    // handle car connection error
    }
    
  4. Panggil mCar.getCarManager() - mCarUxRestrictionsManager untuk mendapatkan CarUxRestrictionsManager :
    CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
    mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
    
  5. Untuk mendaftarkan mUxRChangeListener yang diterapkan 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) mengakibatkan pendengar menerima perubahan pembatasan ketika 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 mengoptimalkan gangguan?
  2. Jika ya, batasan apa yang berlaku saat ini?

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

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

Catatan: Perubahan kecil terhadap serangkaian pembatasan diperkirakan akan terjadi dalam waktu dekat.

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

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

Negara Mengemudi

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

CarDrivingStateEvent .

berubah, metode onDrivingStateChanged() 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 kondisi mengemudi. Gunakan perintah shell ADB untuk memasukkan peristiwa kendaraan. Ini bisa menjadi pengembangan dan pengujian yang berguna.

Untuk menyimulasikan kejadian berkendara:

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