Memakai status mengemudi mobil dan batasan UX

Halaman ini menjelaskan cara aplikasi dapat beralih dengan lancar ke gangguan antarmuka pengguna yang dioptimalkan (DO). Ini menjelaskan cara memakai status mengemudi mobil serta batasan pengalaman pengguna yang terkait. Untuk informasi selengkapnya tentang batasan Pengalaman Pengguna (UX) Mobil, lihat Pembatasan Pengalaman Pengguna Mobil, yang menjelaskan tiga status mengemudi yaitu Parkir, {i>Idling<i}, dan {i>Pindah<i}.

Audiens

Konten ini disediakan bagi mereka yang ingin mendesain aplikasi yang beradaptasi dengan perubahan pada kondisi mengemudi mobil dan batasan UX yang terkait.

Detail teknis

CarDrivingStateManager

Keadaan mengemudi mobil (Terparkir, Tidak Aktif, atau Bergerak) berasal dari nilai sensor yang diberikan oleh {i> Vehicle Hardware Abstraksi Layer<i} (VHAL). Informasi sensor dasar, seperti kecepatan kendaraan dan pemilihan roda gigi saat ini, digunakan untuk memperoleh status mengemudi kendaraan saat ini.

CarDrivingStateEvent.

yang menyediakan @SystemApis, artinya hanya Platform Internal, APK Paket (seperti SysUI atau Settings), dan APK dengan Hak Istimewa (seperti) GMSCore dapat mengakses API. API ini 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.

CarUxRestrictionsManager

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

Catatan: Aktivitas ini harus ditandai sebagai distraksi dioptimalkan, seperti yang dijelaskan di Pedoman gangguan bagi pengemudi. Jika tidak ditandai dengan benar, aktivitas akan diblokir.

Sebagai gantinya, aplikasi memantau pembatasan yang diekspos oleh CarUxRestrictionsManager dan bukan status mengemudi absolut yang diekspos oleh CarDrivingStateManager untuk apa pun yang terkait dengan pengguna antarmuka pengguna atau {i>user experience.<i}

Contoh kode

Kode contoh berikut mengilustrasikan cara aplikasi memantau batasan UX:

  1. Impor paket library mobil:
    import android.car.Car;
    /* For CarUxRestrictions */
    import android.car.drivingstate.CarUxRestrictions;
    import android.car.drivingstate.CarUxRestrictionsManager;
    
  2. Terapkan CarUxRestrictionManager.OnUxRestrictionsChangedListener (mUxRChangeListener). Pemroses ini, saat didaftarkan dengan CarUxRestrictionsManager, dipanggil saat terjadi perubahan dalam pembatasan UX apa yang terjadi. 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 CarUxRestrictionsManager panggilan mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
    

Blok kode contoh yang telah selesai (dibuat pada Langkah 3 hingga Langkah 5) menghasilkan pemroses menerima perubahan pembatasan 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 Mobil

Objek CarUxRestrictions menyediakan dua jenis informasi:

  1. Apakah ada persyaratan saat ini agar gangguan dioptimalkan?
  2. Jika demikian, pembatasan apa yang saat ini diterapkan?

Jika CarUxRestrictions diperoleh dari salah satu getCurrentUxRestrictions() atau callback pemroses, aplikasi kini dapat menggunakan isRequiresDistractionOptimization() API untuk menentukan apakah Distraction Dioptimalkan tidak diperlukan. Jika kueri ini menampilkan false, Anda tidak perlu menampilkan Distraction Dioptimalkan dan aplikasi dapat menjalankan aktivitas apa pun dengan aman.

Jika pengoptimalan diperlukan, gunakan API getActiveRestrictions() untuk mendapatkan kumpulan pembatasan yang diterapkan. Ini API menampilkan int, yang merupakan bit mask dari semua pembatasan yang saat ini berlaku. Tujuan serangkaian pembatasan yang saat ini diberitahukan tercantum di CarUxRestrictions.

Catatan: Perubahan kecil pada kumpulan batasan diperkirakan akan terjadi dalam waktu dekat.

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

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

Negara Bagian

CarDrivingStateManager menampilkan status mengemudi kendaraan yang sebenarnya (Terparkir, Tidak Ada Aktivitas, atau Pindahan). API CarDrivingStateManager dapat dipanggil seperti halnya CarUxRestrictionsManager. Aplikasi dapat mendaftarkan pemroses atau mendapatkan status mengemudi saat ini. Status mengemudi ditampilkan sebagai CarDrivingStateEvent.

CarDrivingStateEvent.

perubahan, metode onDrivingStateChanged() akan dipanggil dengan metode 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();
   }
};

Pengujian

Anda bisa meniru perubahan persneling dan kecepatan untuk mengubah status mengemudi. Menggunakan shell ADB untuk memasukkan peristiwa kendaraan. Hal ini dapat menjadi pengembangan dan pengujian yang berguna.

Untuk menyimulasikan peristiwa mengemudi:

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