Menggunakan status mengemudi mobil dan batasan UX

Halaman ini menjelaskan cara aplikasi dapat bertransisi dengan lancar ke antarmuka pengguna yang dioptimalkan untuk gangguan (DO). Panduan ini menjelaskan cara menggunakan status mengemudi mobil serta batasan pengalaman pengguna yang sesuai. Untuk mengetahui informasi selengkapnya tentang batasan Pengalaman Pengguna (UX) Mobil, lihat Batasan Pengalaman Pengguna Mobil, yang menjelaskan tiga status mengemudi, yaitu Parkir, Tidak Ada Aktivitas, dan Bergerak.

Audiens

Konten ini disediakan bagi mereka yang ingin mendesain aplikasi yang beradaptasi dengan perubahan status mengemudi mobil dan pembatasan UX yang diterapkan.

Detail teknis

CarDrivingStateManager

Status mengemudi mobil (Diparkir, Mundur, atau Bergerak) berasal dari nilai sensor yang disediakan oleh Vehicle Hardware Abstraction Layer (VHAL). Informasi sensor dasar, seperti kecepatan kendaraan dan pemilihan gigi saat ini, digunakan untuk mendapatkan status mengemudi kendaraan saat ini.

CarDrivingStateEvent.

yang menyediakan @SystemApis, yang berarti hanya Platform Internal, APK yang Dipaketkan (seperti SysUI atau Setelan), dan APK Berhak 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.

CarUxRestrictionsManager

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

Catatan: Aktivitas ini harus ditandai sebagai dioptimalkan untuk mengurangi gangguan, seperti yang dijelaskan dalam Panduan gangguan pengemudi. Jika tidak ditandai dengan benar, aktivitas akan diblokir.

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

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 terdaftar dengan CarUxRestrictionsManager, dipanggil saat terjadi perubahan pada pembatasan UX. Tangani perubahan batasan agar dioptimalkan untuk mengurangi gangguan, 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 di Langkah 2 di atas dengan CarUxRestrictionsManager, panggil mCarUxRestrictionsManager.registerListener():
    mCarUxRestrictionsManager.registerListener(mUxrChangeListener);
    mUxrChangeListener.onUxRestrictionsChanged(
    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());

Blok kode contoh yang telah selesai (dibuat di Langkah 3 hingga Langkah 5) akan membuat pemroses 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());

CarUxRestrictions

Objek CarUxRestrictions menyediakan dua jenis informasi:

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

Saat CarUxRestrictions diperoleh dari getCurrentUxRestrictions() atau callback pemroses, aplikasi kini dapat menggunakan isRequiresDistractionOptimization() API untuk menentukan apakah Distracted Optimze diperlukan. Jika ini menampilkan false, tidak ada persyaratan untuk menjadi Distorsi Dioptimalkan dan aplikasi dapat menjalankan aktivitas apa pun dengan aman.

Jika pengoptimalan diperlukan, gunakan API getActiveRestrictions() untuk mendapatkan kumpulan pembatasan yang diterapkan. API ini menampilkan int, yang merupakan bit mask dari semua batasan yang saat ini berlaku. Kumpulan batasan yang saat ini diberi tahu tercantum di bagian CarUxRestrictions.

Catatan: Perubahan kecil pada kumpulan batasan 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();
}

DrivingState

CarDrivingStateManager menampilkan status mengemudi kendaraan yang sebenarnya (Parkir, Idling, atau Moving). CarDrivingStateManager API dapat dipanggil mirip dengan CarUxRestrictionsManager. Aplikasi dapat mendaftarkan pemroses atau mendapatkan status mengemudi saat ini. Status mengemudi ditampilkan sebagai CarDrivingStateEvent.

CarDrivingStateEvent.

berubah, 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 perubahan gigi dan kecepatan untuk mengubah status mengemudi. Gunakan perintah shell ADB untuk memasukkan peristiwa kendaraan. Hal ini dapat berguna untuk pengembangan dan pengujian.

Untuk menyimulasikan peristiwa mengemudi:

  1. Untuk menetapkan kecepatan ke 0:
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
  2. Untuk menyetel gigi ke Parkir (untuk menyimulasikan CarDrivingStateEvent yang mengarah ke PARKIR):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11400400 4
  3. Untuk menyetel gigi ke Drive, 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 menetapkan kecepatan ke 30 meter per detik (untuk menyimulasikan CarDrivingStateEvent yang mengarah ke MOVING):
    adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 30