Batasan Pengalaman Pengguna Mobil

Sebelum melanjutkan, tinjau Panduan Gangguan Mengemudi.

Halaman ini menjelaskan aturan Pembatasan Pengalaman Pengguna (UX) Mobil yang dapat Anda gunakan untuk membuat beberapa konfigurasi aturan Pembatasan UX (misalnya, Uni Eropa versus Jepang), lalu menentukan kumpulan aturan yang akan diterapkan pada waktu proses. Untuk mengetahui informasi selengkapnya, lihat CarUxRestrictions.

Layanan Batasan UX Mobil memungkinkan developer menentukan konfigurasi Batasan UX Mobil baru. Jika developer ingin mengubah aturan pembatasan (seperti untuk mematuhi standar keamanan lokal), developer dapat menggunakan API untuk menentukan konfigurasi baru.

API untuk menetapkan konfigurasi hanya tetap ada di konfigurasi baru. Dengan kata lain, konfigurasi tidak langsung berlaku. Sebagai gantinya, konfigurasi baru dimuat saat layanan Batasan UX dimulai ulang dan mobil dalam posisi Parkir. Layanan mobil memastikan mobil berada dalam posisi Parkir sebelum memuat ulang konfigurasi baru.

Selain metode layanan Pembatasan UX baru, API disediakan untuk membuat konfigurasi. Status pemilihan gigi dan kecepatan dikonversi menjadi salah satu dari tiga status mengemudi:

  • Terparkir. Gigi di posisi Parkir.
  • Idling. Gigi tidak di posisi Parkir dan kecepatan nol.
  • Pindah. Gigi tidak di posisi Parkir dan kecepatan tidak nol.

Untuk mempelajari cara aplikasi menggunakan status mengemudi mobil dan batasan UX yang sesuai, lihat Menggunakan Status Mengemudi Mobil dan Batasan UX.

Konfigurasi batasan berdasarkan kondisi berkendara

Untuk mencegah gangguan pengemudi, Android memetakan status mengemudi ke serangkaian Pembatasan UX /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

  • Terparkir. Tidak dibatasi.
  • Idling. Tidak ada video dan tidak ada layar konfigurasi.
  • Pindah. Dibatasi sepenuhnya (semua batasan diperlukan).

Pemetaan yang diilustrasikan di atas telah ditentukan sebelumnya dan dikonfigurasi sebagai resource XML. /packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java kemudian akan menyimpan aturan dalam memori. Layanan kemudian memetakan status mengemudi saat ini ke Pembatasan UX dan menyiarkan pembatasan saat ini ke seluruh sistem.

<!-- No restrictions when car is parked -->
<DrivingState car:state="parked">
    <Restrictions car:requiresDistractionOptimization="false"
                  car:uxr="baseline"/>
</DrivingState>

<!-- Restrictions when car is idling -->
<DrivingState car:state="idling">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="no_video|no_config"/>
</DrivingState>

<!-- Restrictions for speed >= 0 m/s -->
<DrivingState car:state="moving" car:minSpeed="0.0">
    <Restrictions car:requiresDistractionOptimization="true"
                  car:uxr="fully_restricted"/>
</DrivingState>

Konfigurasi untuk beberapa layar

Secara default, tidak ada batasan yang diterapkan ke layar tambahan. Untuk membuat konfigurasi batasan untuk beberapa layar, sertakan tag RestrictionMapping dengan physicalPort untuk layar tersebut. Pembatasan yang sesuai akan otomatis diterapkan ke setiap layar. Dalam contoh berikut, layar dengan ID Port fisik 1 dan 2 memiliki konfigurasi yang berbeda:

<RestrictionMapping car:physicalPort="1">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard|no_video"/>
       </DrivingState>
   </RestrictionMapping>

   <RestrictionMapping car:physicalPort="2">
       <DrivingState car:state="moving">
           <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
       </DrivingState>
  </RestrictionMapping>

Konfigurasi untuk mode pembatasan

Anda dapat memilih nama apa pun untuk mode tersebut, seperti remaja. Pada contoh berikut, pembatasan yang berbeda dikonfigurasi untuk mode default dan penumpang (sebelumnya, hanya mode penumpang yang didukung):

<DrivingState car:state="idling">
    <Restrictions car:mode="passenger" car:requiresDistractionOptimization="false" car:uxr="baseline"/>
    <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
</DrivingState>
</Restrictions>
Anda dapat menggunakan API untuk menetapkan nama string apa pun untuk mode. Misalnya, metode setRestrictionMode(@NonNull String mode) di CarUxRestrictionsManager. (Sebelumnya, Anda akan menggunakan metode setRestrictionMode(@CarUxRestrictionsManager.UxRestrictionMode int mode) di CarUxRestrictionsManager).

CarUxRestrictionsConfiguration API

Pembatasan dengan CarUxRestrictionsConfiguration

Class baru CarUxRestrictionsConfiguration dipetakan 1:1 ke skema konfigurasi XML saat ini. CarUxRestrictionsConfiguration dapat dibuat dengan CarUxRestrictions.Builder, yang memvalidasi konfigurasi setelah build().

new CarUxRestrictionsConfiguration.Builder()
        // Explicitly set restrictions for each driving state.
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
                /* requiresOptimization= */ false,
                /* restrictions= */ UX_RESTRICTIONS_BASELINE)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
                true,
                UX_RESTRICTIONS_NO_VIDEO|UX_RESTRICTIONS_NO_SETUP)
        .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
                true,
                UX_RESTRICTIONS_FULLY_RESTRICTED)
        // Set restriction parameters.
        .setMaxStringLength(int max)
        .setMaxCumulativeContentItems(int max)
        .setMaxContentDepth(int max)
        // Build a new CarUxRestrictionsConfiguration.
        .build();

CarUxRestrictionsManager API

Tetapkan CarUxRestrictionsConfiguration untuk drive berikutnya dengan CarUxRestrictionsManager. Metode ini memerlukan izin, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION.

public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
        CarUxRestrictionsConfiguration config);

Mempertahankan konfigurasi Batasan UX baru

Saat konfigurasi baru diteruskan, layanan Batasan UX akan menampilkan boolean untuk menunjukkan apakah konfigurasi baru berhasil disimpan. Konfigurasi baru ini hanya digunakan saat Integrated Head Unit (IHU) dimulai ulang dan mobil diparkir. Secara internal, layanan Pembatasan UX berisi dua kumpulan konfigurasi:

  • Produksi. Meskipun bersifat opsional, konfigurasi ini sering kali ada. Layanan Batasan UX membaca konfigurasi ini saat memulai.
  • Bertahap. Konfigurasi ini juga bersifat opsional, tidak memengaruhi Batasan UX, dan dipromosikan ke Produksi saat layanan mobil dimulai dan saat mobil diparkir.

Konfigurasi produksi

Gambar 1. Konfigurasi produksi

Kegagalan alamat

Hingga informasi status mengemudi diterima dari CarPropertyManager (misalnya, selama proses booting), Batasan UX tidak akan diterapkan. Sistem berperilaku seolah-olah status mengemudi adalah Parkir.

Jika pembacaan konfigurasi tersimpan gagal (misalnya, hasil SettingNotFoundException), layanan Batasan UX akan kembali ke mode hard code yang sepenuhnya dibatasi:

// Idling/moving state is fully restricted.
private static CarUxRestrictionsConfiguration generateDefaultConfig() {}

Status mengemudi dan batasan pengguna

Konten berikut menjelaskan interaksi yang ditampilkan dalam diagram desain berikut:

Interaksi status mengemudi

Gambar 2. Interaksi status mengemudi

Properti yang digunakan untuk mendapatkan status mengemudi

Gunakan tiga VehiclePropertyIds berikut untuk mendapatkan status mengemudi:

API yang tersedia untuk aplikasi

Kode tersebut berada di lokasi berikut:

Kode Lokasi
CarUxRestrictionsManager
API publik untuk mendaftar ke perubahan Pembatasan UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarUxRestrictions
Definisi batasan UX.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java
CarDrivingStateManager
API sistem untuk mendaftarkan perubahan status mengemudi.
/packages/services/Car/+/main/car-lib/src/android/car/drivingstate/CarDrivingStateManager.java

Untuk menyimulasikan status mengemudi, lihat Pengujian.