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:
- 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 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); } };
- 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 di Langkah 2 di atas denganCarUxRestrictionsManager
, panggilmCarUxRestrictionsManager.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:
- Apakah saat ini ada persyaratan untuk pengoptimalan gangguan?
- 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:
- Untuk menetapkan kecepatan ke 0:
adb shell dumpsys activity service com.android.car inject-vhal-event 0x11600207 0
- 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
- 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
- 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