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:
- Impor paket library mobil:
import android.car.Car; /* For CarUxRestrictions */ import android.car.drivingstate.CarUxRestrictions; import android.car.drivingstate.CarUxRestrictionsManager;
- 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); } };
- 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 }
- Panggil
mCar.getCarManager() - mCarUxRestrictionsManager
untuk mendapatkanCarUxRestrictionsManager
:CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager) mCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
- Untuk mendaftarkan
mUxRChangeListener
yang diterapkan pada Langkah 2 di atas denganCarUxRestrictionsManager
panggilanmCarUxRestrictionsManager.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:
- Apakah ada persyaratan saat ini agar gangguan dioptimalkan?
- 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:
- Untuk menyetel kecepatan ke 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- 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
- 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
- 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