Menambahkan dukungan untuk Android Automotive OS ke aplikasi parkir

Saat mendistribusikan aplikasi ke perangkat Android Automotive OS, ada beberapa pertimbangan khusus untuk faktor bentuk yang harus Anda ketahui. Panduan ini menjelaskan pertimbangan tersebut.

Menguji aplikasi yang ada di emulator Android Automotive OS

Untuk mulai membangun aplikasi untuk Android Automotive OS, uji terlebih dahulu aplikasi seluler yang ada di emulator Android Automotive OS. Untuk menyiapkan emulator, ikuti langkah-langkah di Pengujian menggunakan emulator Android Automotive OS. Selanjutnya, Anda dapat menjalankan aplikasi dengan mengikuti petunjuk di Menjalankan aplikasi di emulator.

Saat menjalankan aplikasi, perhatikan masalah kompatibilitas, seperti berikut:

  • Layar infotainment memiliki orientasi tetap. Untuk memenuhi pedoman kualitas aplikasi mobil, aplikasi harus mendukung orientasi potret dan lanskap.
  • API yang tersedia pada perangkat lain mungkin tidak tersedia di Android Automotive OS. Misalnya, beberapa API layanan Google Play tidak tersedia di Android Automotive OS. Lihat bagian Menonaktifkan fitur untuk mengetahui detail cara menangani masalah ini.

Mengonfigurasi file manifes aplikasi Anda

Untuk menargetkan perangkat Android Automotive OS, aplikasi Anda harus memiliki entri manifes tertentu. Setelah Anda memilih untuk mendistribusikan ke perangkat Android Automotive OS, Google Play akan meninjau aplikasi yang kompatibel untuk membantu memastikan aplikasi tersebut aman digunakan di mobil. Lihat Mendistribusikan ke mobil untuk mengetahui detail selengkapnya.

Fitur Android Automotive OS yang diperlukan

Semua aplikasi yang dibuat untuk Android Automotive OS harus memenuhi persyaratan tertentu agar dapat didistribusikan menggunakan Google Play. Lihat Memenuhi persyaratan fitur Google Play untuk mengetahui informasi selengkapnya.

Entri manifes khusus kategori

Selain persyaratan sebelumnya, yang berlaku untuk semua aplikasi parkir, kategori video dan game memiliki persyaratan tambahan:

Memenuhi persyaratan gangguan pengemudi

Menghindari gangguan pengemudi sangat penting saat menghadirkan aplikasi Anda ke mobil. Untuk aplikasi parkir, hal ini terutama dilakukan dengan mencegah aplikasi Anda digunakan atau memutar audio saat batasan pengalaman pengguna (UX) aktif, seperti yang tercantum dalam pedoman kualitas DD-2 dan DD-3.

Mencegah penggunaan saat batasan pengalaman pengguna aktif

Secara default, aktivitas tidak dapat digunakan atau diluncurkan saat batasan UX aktif. Untuk memastikan perilaku ini berlaku untuk aplikasi Anda, aplikasi tidak boleh menyertakan elemen <meta-data> berikut dalam elemen <activity> apa pun dalam manifes Anda:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Jika aktivitas di aplikasi Anda Dilanjutkan saat batasan UX aktif, aktivitas tersebut akan dikaburkan oleh aktivitas yang dimiliki oleh OS.

Setidaknya, transisi aktivitas aplikasi Anda ke status siklus proses Dijeda. Hal ini terjadi sebagai callback siklus proses onPause dan selama itu Anda harus menjeda pemutaran video dan audio dari aplikasi Anda.

Di perangkat yang menyertakan mode kompatibilitas Android Automotive OS , pemblokiran sistem menyebabkan aktivitas aplikasi Anda bertransisi melalui status Dijeda ke status Dihentikan.

Menghentikan pemutaran dan mencegah kelanjutan pemutaran

Untuk beberapa aplikasi, menjeda pemutaran selama onPause() dan melacak status untuk mencegah kelanjutan pemutaran hingga onResume() sudah cukup untuk memenuhi persyaratan gangguan pengemudi.

Jika bereaksi terhadap callback siklus proses tidak cukup untuk aplikasi Anda, Anda dapat memproses status batasan UX secara langsung seperti yang dijelaskan di bagian berikut. Misalnya, aplikasi yang mendukung picture-in-picture mungkin lebih memilih untuk memproses secara langsung daripada melakukan pemeriksaan bersyarat dalam callback siklus proses.

Memproses batasan pengalaman pengguna

Untuk memproses batasan UX, pertama-tama tambahkan dependensi pada library android.car di file build.gradle modul aplikasi Anda. Ini adalah ekstensi ke Android SDK yang menyediakan API khusus untuk Android Automotive OS.

android {
    ...
    useLibrary("android.car")
}

Gunakan CarUxRestrictionsManager untuk membaca status batasan UX. Jangan mencoba menentukan status batasan UX dari status hardware lain seperti gigi atau kecepatan, karena batasan UX dapat bervariasi dari satu tampilan ke tampilan lain dalam kendaraan.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

Satu-satunya nilai yang diberikan oleh CarUxRestrictions yang dirujuk oleh aplikasi Anda adalah nilai yang ditampilkan dari isRequiresDistractionOptimization. Nilai lainnya hanya relevan untuk aktivitas yang ditandai sebagai dioptimalkan untuk gangguan.

Menguji implementasi Anda

Validasi bahwa aplikasi Anda memenuhi persyaratan gangguan pengemudi menggunakan prosedur berikut:

  1. Instal aplikasi Anda pada image sistem tanpa Google Play Store atau Mode kompatibilitas.
  2. Dengan kotak aplikasi peluncur terbuka, simulasikan mengemudi dan pastikan aplikasi Anda tidak dapat dibuka.
  3. Hentikan simulasi mengemudi dan buka aplikasi Anda ke layar pemutaran, lalu mulai pemutaran.
  4. Simulasikan mengemudi lagi dan pastikan pemutaran dijeda.
    1. Jika aplikasi Anda mendukung integrasi dengan MediaSession, gunakan adb shell cmd media_session dispatch play dan pastikan pemutaran tidak dilanjutkan.

Mengoptimalkan aplikasi untuk Android Automotive OS

Untuk memberikan pengalaman terbaik kepada pengguna di mobil, perhatikan hal berikut saat membuat aplikasi untuk Android Automotive OS:

Menggunakan inset jendela dan potongan layar

Seperti faktor bentuk lainnya, Android Automotive OS menyertakan elemen UI sistem, seperti status dan kolom navigasi, serta dukungan untuk tampilan non-persegi.

Secara default, aplikasi digambar di area yang tidak tumpang-tindih dengan kolom sistem atau potongan layar. Namun, Anda mungkin ingin aplikasi menyembunyikan kolom sistem, menggambar konten di belakangnya, atau menampilkan konten di potongan layar seperti yang dijelaskan dalam Menata aplikasi dalam inset jendela. Jika aplikasi Anda melakukan salah satu hal ini, lihat subbagian berikut untuk mengetahui detail tentang cara membuat aplikasi Anda berfungsi dengan baik di seluruh ekosistem perangkat Android Automotive OS.

Kolom sistem, mode imersif, dan rendering tepi-ke-tepi

Kolom sistem di mobil mungkin berukuran dan diposisikan berbeda dengan faktor bentuk lainnya. Misalnya, kolom navigasi dapat diposisikan di kiri, kanan, atau bawah layar. Bahkan jika ada kolom status di bagian atas dan kolom navigasi di bagian bawah (seperti pada sebagian besar ponsel dan tablet), ukuran elemen ini kemungkinan akan jauh lebih besar di mobil.

Selain itu, Android Automotive OS memungkinkan OEM mengontrol apakah aplikasi dapat menampilkan atau menyembunyikan kolom sistem untuk masuk dan keluar dari mode imersif mode. Misalnya, dengan mencegah aplikasi menyembunyikan kolom sistem, OEM dapat memastikan bahwa kontrol kendaraan, seperti pengontrol kondisi udara, selalu dapat diakses di layar. Jika OEM mencegah aplikasi mengontrol kolom sistem, tidak ada yang terjadi saat aplikasi memanggil WindowInsetsController (atau WindowInsetsControllerCompat) API untuk menampilkan atau menyembunyikan kolom sistem. Lihat dokumentasi show dan hide untuk mempelajari lebih lanjut cara mendeteksi apakah aplikasi Anda dapat mengubah inset.

Demikian pula, OEM juga dapat mengontrol apakah aplikasi dapat menetapkan warna dan transparansi kolom sistem untuk memastikan bahwa kolom dan elemen yang ada di dalamnya terlihat jelas setiap saat. Jika aplikasi Anda menggambar tepi-ke-tepi, pastikan hanya konten non-kritis yang digambar di belakang kolom sistem. Konten ini mungkin tidak terlihat jika OEM perangkat mencegah penetapan warna atau transparansi kolom.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Jika aplikasi Anda menggunakan tepi-ke-tepi, jangan membuat asumsi tentang ukuran, jumlah, jenis, atau lokasi kolom sistem. Sebagai gantinya, gunakan window insets API untuk menata konten aplikasi Anda relatif terhadap kolom sistem. Lihat Menampilkan konten tepi-ke-tepi di aplikasi Anda untuk mengetahui detail selengkapnya tentang cara menggunakan API ini. Nilai padding yang dikodekan secara permanen tidak pernah direkomendasikan untuk faktor bentuk apa pun, tetapi di mobil, nilai tersebut mungkin tidak akan berfungsi untuk menjaga konten tetap berada di area aman.

Menyesuaikan dengan tampilan berbentuk tidak beraturan

Selain tampilan persegi panjang, beberapa kendaraan mungkin memiliki layar berbentuk tidak beraturan, seperti yang ditunjukkan pada Gambar 1:

Perangkat Android Automotive OS dengan layar yang melengkung di sisi kanan.
Gambar 1: Perangkat Android Automotive OS dengan layar yang melengkung di sisi kanan. Area hijau adalah persegi panjang aman yang tidak tumpang-tindih dengan kotak pembatas potongan layar kurva.

Jika aplikasi Anda tidak merender tepi-ke-tepi, Anda tidak perlu melakukan apa pun agar aplikasi dapat dirender dalam area aman.

Jika aplikasi Anda merender tepi-ke-tepi, Anda dapat memilih cara aplikasi berperilaku terkait potongan layar. Anda dapat melakukannya menggunakan resource dengan menetapkan atribut android:windowLayoutInDisplayCutoutMode untuk tema aplikasi atau saat runtime dengan mengubah atribut layoutInDisplayCutoutMode jendela.

Karena jenis potongan layar yang ada di perangkat Android Automotive OS berbeda dengan yang ada di perangkat seluler, jangan gunakan LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT atau LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, yang memiliki perilaku yang dioptimalkan untuk potongan yang ditemukan di perangkat seluler. Sebagai gantinya, gunakan LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER atau LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS untuk selalu menghindari atau selalu memasuki potongan. Saat memilih yang terakhir, lihat Mendukung potongan layar untuk mengetahui detail selengkapnya tentang API yang terkait dengan potongan layar.

Jika aplikasi Anda dirender ke area potongan layar dan Anda ingin memiliki perilaku yang berbeda antara Android Automotive OS dan seluler, lihat Menonaktifkan fitur untuk mendapatkan panduan jika aplikasi Anda menetapkan perilaku ini saat runtime dan Menggunakan resource alternatif jika aplikasi Anda menetapkan perilaku ini menggunakan file resource.

Menonaktifkan fitur

Jika Anda menyediakan aplikasi seluler di Android Automotive OS, fitur dan fungsi tertentu mungkin tidak relevan atau tidak tersedia. Misalnya, mobil biasanya tidak menyediakan akses ke kamera. Selain itu, hanya sebagian layanan Google Play yang tersedia di Android Automotive OS; lihat Layanan Google Play untuk mobil untuk detail selengkapnya.

Anda dapat menggunakan PackageManager.hasSystemFeature API untuk mendeteksi apakah aplikasi berjalan di Android Automotive OS dengan memeriksa fitur FEATURE_AUTOMOTIVE, seperti ditunjukkan pada contoh berikut:

val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
    // Enable or disable a given feature
}

Atau, jika aplikasi Anda juga memiliki komponen Android Auto, Anda dapat menggunakan CarConnection API dari Library Aplikasi Android untuk Mobil untuk mendeteksi apakah aplikasi berjalan di Android Automotive OS atau Android Auto—atau apakah aplikasi tidak terhubung ke mobil sama sekali.

Untuk picture-in-picture (PiP), ikuti praktik terbaik yang telah ditetapkan untuk memeriksa apakah fitur ini tersedia dan bereaksi dengan tepat.

Menangani skenario offline

Meskipun mobil menjadi lebih banyak terhubung ke internet, aplikasi direkomendasikan untuk menangani operasi tanpa koneksi internet, seperti dalam kasus berikut:

  • Pengguna dapat memilih untuk tidak menggunakan data seluler yang ditawarkan sebagai bagian dari paket langganan dari produsen mobil.
  • Akses ke data seluler mungkin dibatasi di area tertentu.
  • Mobil dengan radio Wi-Fi mungkin berada di luar jangkauan Wi-Fi, atau OEM mungkin menonaktifkan Wi-Fi dan mengutamakan jaringan seluler.

Bersiaplah untuk menangani skenario ini di aplikasi Anda dengan melakukan degradasi halus pada fungsi yang bergantung pada akses internet, misalnya dengan menawarkan konten offline. Untuk mengetahui informasi selengkapnya, lihat praktik terbaik untuk mengoptimalkan jaringan.

Menggunakan resource alternatif

Guna membantu menyesuaikan aplikasi untuk mobil, Anda dapat menggunakan car penentu resource untuk menyediakan resource alternatif saat berjalan di kendaraan Android Automotive OS Google. Misalnya, jika menggunakan Resource dimensi untuk menyimpan nilai padding, Anda dapat menggunakan nilai yang lebih besar bagi set resource car untuk membuat target sentuh lebih besar.