Menambahkan dukungan Android Automotive OS ke aplikasi media

Android Automotive OS memungkinkan pengguna menginstal aplikasi di mobil. Supaya menjangkau pengguna di platform ini, Anda perlu mendistribusikan aplikasi yang dioptimalkan bagi pengemudi yang kompatibel dengan Android Automotive OS. Hampir semua kode dan resource di aplikasi Android Auto bisa Anda gunakan kembali, tetapi Anda harus membuat build terpisah yang memenuhi persyaratan di halaman ini.

Ringkasan pengembangan

Menambahkan dukungan Android Automotive OS hanya memerlukan beberapa langkah, seperti yang dijelaskan di bagian berikut ini:

  1. Mengaktifkan fitur otomotif di Android Studio
  2. Membuat modul otomotif.
  3. Memperbarui dependensi Gradle.
  4. Anda juga bisa Menerapkan aktivitas setelan dan login.

Pertimbangan desain

Android Automotive OS menangani tata letak konten media yang diterimanya dari layanan browser media aplikasi Anda. Artinya, aplikasi Anda tidak menggambar UI dan tidak memulai aktivitas apa pun saat pengguna memicu pemutaran media.

Jika Anda menerapkan aktivitas setelan atau login, aktivitas ini harus dioptimalkan untuk kendaraan. Baca Pedoman desain untuk Android Automotive OS saat mendesain area tersebut pada aplikasi Anda.

Menyiapkan project

Anda perlu menyiapkan berbagai bagian project aplikasi Anda untuk mengaktifkan dukungan Android Automotive OS.

Mengaktifkan fitur otomotif di Android Studio

Gunakan Android Studio 4.0 atau yang lebih tinggi untuk memastikan semua fitur Automotive OS diaktifkan.

Membuat modul otomotif

Beberapa komponen Android Automotive OS, seperti manifes, memiliki persyaratan khusus platform. Buat modul yang dapat memisahkan kode untuk komponen ini dari kode lain dalam project Anda, seperti kode yang digunakan untuk aplikasi ponsel.

Ikuti langkah-langkah berikut untuk menambahkan modul otomotif ke project:

  1. Di Android Studio, klik File > New > New Module.
  2. Pilih Automotive Module, lalu klik Next.
  3. Masukkan Application/Library name. Nama ini akan dilihat pengguna aplikasi Anda di Android Automotive OS.
  4. Masukkan Module name.
  5. Sesuaikan Package name agar cocok dengan aplikasi Anda.
  6. Pilih API 28: Android 9.0 (Pie) untuk Minimum SDK, lalu klik Next.

    Semua mobil yang mendukung Android Automotive OS berjalan pada Android 9 (level API 28) atau yang lebih tinggi, jadi memilih nilai ini akan menargetkan semua mobil yang kompatibel.

  7. Pilih No Activity, lalu klik Finish.

Setelah membuat modul di Android Studio, buka AndroidManifest.xml pada modul otomotif baru Anda:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

Elemen application memiliki beberapa informasi aplikasi standar serta elemen uses-feature yang mendeklarasikan dukungan untuk Android Automotive OS. Perhatikan juga bahwa tidak ada aktivitas yang dideklarasikan dalam manifes.

Jika Anda menerapkan aktivitas setelan dan login, tambahkan di sini. Aktivitas ini dipicu oleh sistem menggunakan intent eksplisit dan merupakan satu-satunya aktivitas yang Anda deklarasikan dalam manifes untuk aplikasi Android Automotive OS.

Setelah menambahkan aktivitas setelan dan login, lengkapi file manifes dengan menyetel atribut android:appCategory="audio" di elemen application dan menambahkan elemen uses-feature berikut:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.landscape"
        android:required="false" />

</manifest>

Menyetel fitur ini secara eksplisit ke required="false" memastikan bahwa aplikasi Anda tidak bentrok dengan fitur hardware yang tersedia di perangkat Automotive OS.

Mendeklarasikan dukungan media untuk Android Automotive OS

Gunakan entri manifes berikut untuk mendeklarasikan bahwa aplikasi Anda mendukung Android Automotive OS:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Entri manifes ini merujuk ke sebuah file XML yang mendeklarasikan kemampuan otomotif yang didukung aplikasi Anda.

Untuk menunjukkan bahwa Anda memiliki aplikasi media, tambahkan file XML dengan nama automotive_app_desc.xml ke direktori res/xml/ di project Anda. Sertakan konten berikut dalam file ini:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Filter intent

Android Automotive OS menggunakan intent eksplisit untuk memicu aktivitas di aplikasi media Anda. Jangan sertakan aktivitas apa pun yang memiliki filter intent CATEGORY_LAUNCHER atau ACTION_MAIN dalam file manifes.

Aktivitas seperti dalam contoh berikut biasanya menargetkan ponsel atau jenis perangkat seluler lainnya. Deklarasikan aktivitas ini dalam modul yang membuat aplikasi ponsel, bukan dalam modul yang membuat aplikasi Android Automotive OS Anda.

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

Memperbarui dependensi Gradle Anda

Sebaiknya Anda menempatkan layanan browser media dalam modul terpisah yang Anda gunakan bersama dengan aplikasi ponsel dan modul otomotif. Jika menggunakan pendekatan ini, Anda harus memperbarui modul otomotif untuk menyertakan modul bersama, seperti yang ditampilkan dalam cuplikan berikut:

my-auto-module/build.gradle

Groovy

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

Menerapkan aktivitas setelan dan login

Selain layanan browser media, Anda juga dapat menyediakan aktivitas setelan dan login yang dioptimalkan untuk kendaraan untuk aplikasi Android Automotive OS Anda. Aktivitas ini memungkinkan Anda menyediakan fungsi aplikasi yang tidak disertakan dalam API Android Media.

Hanya terapkan aktivitas ini jika aplikasi Android Automotive OS perlu mengizinkan pengguna login atau menentukan setelan aplikasi. Aktivitas ini tidak digunakan oleh Android Auto.

Alur kerja aktivitas

Diagram berikut menunjukkan cara pengguna berinteraksi dengan aktivitas setelan dan login Anda menggunakan Android Automotive OS:

Alur kerja untuk aktivitas Setelan dan Login

Gambar 1. Alur kerja aktivitas setelan dan login.

Hindari gangguan di setelan dan aktivitas login

Untuk memastikan aktivitas setelan dan/atau login Anda hanya tersedia untuk digunakan saat kendaraan pengguna diparkir, pastikan elemen <activity> tidak menyertakan elemen <meta-data> berikut. Aplikasi akan ditolak selama peninjauan jika ada elemen tersebut.

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

Menambahkan aktivitas setelan

Anda dapat menambahkan aktivitas setelan yang dioptimalkan untuk kendaraan sehingga pengguna dapat mengonfigurasi setelan untuk aplikasi Anda di mobil mereka. Aktivitas setelan juga dapat menyediakan alur kerja lain, seperti login atau logout dari akun pengguna atau beralih akun pengguna. Ingat bahwa aktivitas ini hanya dipicu oleh aplikasi yang berjalan di Android Automotive OS. Aplikasi ponsel yang terhubung ke Android Auto tidak menggunakannya.

Mendeklarasikan aktivitas setelan

Anda harus mendeklarasikan aktivitas setelan dalam file manifes aplikasi, seperti ditunjukkan dalam cuplikan kode berikut:

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

Menerapkan aktivitas setelan

Saat pengguna meluncurkan aplikasi Anda, Android Automotive OS mendeteksi aktivitas setelan yang Anda deklarasikan dan menampilkan affordance, seperti ikon. Pengguna dapat mengetuk atau memilih affordance ini menggunakan layar mobil untuk membuka aktivitas. Android Automotive OS mengirimkan intent ACTION_APPLICATION_PREFERENCES yang memberi tahu aplikasi Anda untuk memulai aktivitas setelan.

Bagian lainnya menunjukkan cara menyesuaikan kode dari aplikasi contoh Universal Android Music Player (UAMP) untuk menerapkan aktivitas setelan aplikasi Anda.

Untuk memulai, download kode contoh:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Untuk menerapkan aktivitas, ikuti langkah-langkah berikut:

  1. Salin folder automotive/automotive-lib ke modul otomotif Anda.
  2. Tentukan hierarki preferensi seperti di automotive/src/main/res/xml/preferences.xml.
  3. Terapkan PreferenceFragmentCompat yang ditampilkan oleh aktivitas setelan Anda. Lihat file SettingsFragment.kt dan SettingsActivity.kt di UAMP dan panduan Setelan Android untuk mengetahui informasi selengkapnya.

Saat Anda menerapkan aktivitas setelan, pertimbangkan praktik terbaik berikut untuk menggunakan beberapa komponen di library Preference:

  • Memiliki tidak lebih dari dua level kedalaman di bawah tampilan utama dalam aktivitas setelan.
  • Jangan gunakan DropDownPreference. Gunakan ListPreference sebagai gantinya.
  • Komponen organisasi:
    • PreferenceScreen
      • Ini harus merupakan tingkat atas hierarki preferensi Anda.
    • PreferenceCategory
      • Digunakan untuk mengelompokkan objek Preference bersama-sama.
      • Menyertakan title.
  • Sertakan key dan title di semua komponen berikut. Anda juga dapat menyertakan summary, icon, atau keduanya:
    • Preference
      • Sesuaikan logika di callback onPreferenceTreeClick() dari penerapan PreferenceFragmentCompat Anda.
    • CheckBoxPreference
      • Dapat memiliki summaryOn atau summaryOff, bukan summary untuk teks bersyarat.
    • SwitchPreference
      • Dapat memiliki summaryOn atau summaryOff, bukan summary untuk teks bersyarat.
      • Dapat memiliki switchTextOn atau switchTextOff.
    • SeekBarPreference
      • Menyertakan min, max, dan defaultValue.
    • EditTextPreference
      • Menyertakan dialogTitle, positiveButtonText, dan negativeButtonText.
      • Dapat memiliki dialogMessage dan/atau dialogLayoutResource.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Penggunaan terutama dari ListPreference.
      • Digunakan untuk menampilkan daftar pilihan tunggal objek Preference.
      • Harus memiliki array entries dan entryValues yang sesuai.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Penggunaan terutama dari MultiSelectListPreference
      • Digunakan untuk menampilkan daftar pilihan ganda dari objek Preference.
      • Harus memiliki array entries dan entryValues yang sesuai.

Menambahkan aktivitas login

Jika aplikasi Anda mengharuskan pengguna untuk login, Anda dapat menambahkan aktivitas login yang dioptimalkan untuk kendaraan yang menangani proses login dan logout dari aplikasi Anda. Anda juga dapat menambahkan alur kerja login dan logout ke aktivitas setelan, tetapi Anda harus menggunakan aktivitas login khusus jika aplikasi tidak dapat digunakan hingga pengguna login. Ingat bahwa aktivitas ini hanya dipicu oleh aplikasi yang berjalan di Android Automotive OS. Aplikasi ponsel yang terhubung ke Android Auto tidak menggunakannya.

Mengharuskan login saat aplikasi dimulai

Untuk mengharuskan pengguna login sebelum mereka dapat menggunakan aplikasi Anda, layanan browser media Anda harus melakukan hal-hal berikut:

  1. Dalam metode onLoadChildren() layanan Anda, kirim hasil null menggunakan metode sendResult().
  2. Tetapkan PlaybackStateCompat sesi media ke STATE_ERROR menggunakan metode setState(). Kode ini memberi tahu Android Automotive OS bahwa tidak ada operasi lain yang dapat dijalankan sampai error diselesaikan.
  3. Tetapkan kode error PlaybackStateCompat sesi media ke ERROR_CODE_AUTHENTICATION_EXPIRED. Kode ini memberi tahu Android Automotive OS bahwa pengguna perlu memberikan autentikasi.
  4. Tetapkan pesan error PlaybackStateCompatsetErrorMessage() sesi media menggunakan metode . Karena terlihat oleh pengguna, lokalkan pesan error ini sesuai lokalitas pengguna saat ini.
  5. Tetapkan tambahan PlaybackStateCompat sesi media menggunakan metode setExtras(). Sertakan dua kunci berikut:

Cuplikan kode berikut menunjukkan cara aplikasi mengharuskan pengguna untuk login sebelum menggunakan aplikasi Anda:

Kotlin

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Java

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

Setelah pengguna berhasil diautentikasi, tetapkan PlaybackStateCompat kembali ke kondisi selain STATE_ERROR, lalu arahkan pengguna kembali ke Android Automotive OS dengan memanggil metode finish() aktivitas.

Menerapkan aktivitas login

Google menawarkan berbagai alat identitas yang dapat digunakan untuk membantu pengguna login ke aplikasi Anda di mobil mereka. Beberapa fitur, seperti Firebase Authentication, menyediakan toolkit full stack yang dapat membantu Anda membuat pengalaman autentikasi yang disesuaikan. Alat lainnya memanfaatkan kredensial yang sudah dimiliki pengguna atau teknologi lain untuk membantu Anda memberikan pengalaman login yang lancar.

Alat berikut dapat membantu Anda mempermudah proses login bagi pengguna yang sebelumnya sudah login di perangkat lain:

  • Pendaftaran dan Login Sekali Ketuk: jika sudah menerapkan Sekali Ketuk untuk perangkat lain, seperti aplikasi ponsel, Anda dapat menerapkannya untuk Aplikasi Android Automotive OS guna mendukung pengguna Sekali Ketuk yang sudah ada.
  • Login dengan Google: jika sudah menerapkan Login dengan Google untuk perangkat lain, seperti aplikasi ponsel, terapkan Login dengan Google untuk perangkat Aplikasi Android Automotive OS Anda guna mendukung pengguna yang sudah Login dengan Google.
  • Isi Otomatis dengan Google: jika pengguna menggunakan Isi Otomatis dengan Google di perangkat Android lain, kredensial mereka akan disimpan ke Pengelola Sandi Google. Saat pengguna tersebut login ke aplikasi Android Automotive OS, Isi Otomatis dengan Google akan menyarankan kredensial tersimpan yang relevan. Penggunaan Isi Otomatis dengan Google tidak memerlukan upaya pengembangan aplikasi. Namun, developer aplikasi dapat mengoptimalkan aplikasi mereka untuk mendapatkan hasil yang berkualitas lebih baik. Isi Otomatis dengan Google didukung oleh semua perangkat yang menjalankan Android 8.0 (level API 26) atau yang lebih tinggi, termasuk Android Automotive OS.

Menggunakan AccountManager

Aplikasi Android Automotive OS yang memiliki autentikasi harus menggunakan AccountManager karena alasan berikut:

  • UX yang lebih baik dan kemudahan pengelolaan akun: pengguna dapat mengelola semua akun mereka dengan mudah dari menu akun di setelan sistem, termasuk login dan logout.
  • Pengalaman "Tamu": mobil adalah perangkat bersama, yang berarti OEM dapat mengaktifkan pengalaman "tamu" di kendaraan, yang tidak dapat ditambahkan akun. Pembatasan ini dicapai menggunakan DISALLOW_MODIFY_ACCOUNTS untuk AccountManager.

Izin

Jika Anda perlu meminta izin dari pengguna, gunakan alur yang sama dengan aktivitas autentikasi atau aktivitas setelan di diagram alur kerja aktivitas yang ditampilkan di bagian sebelumnya.

Penanganan Error

Error di aplikasi media pada Android Automotive OS dikomunikasikan melalui PlaybackStateCompat sesi media. Untuk semua error, tetapkan kode error dan pesan error yang sesuai di PlaybackStateCompat. Hal ini menyebabkan Toast muncul di UI.

Saat terjadi error namun pemutaran dapat dilanjutkan, tentukan error non-fatal. Misalnya, pengguna mungkin dapat memutar musik pada aplikasi sebelum login, tetapi mereka harus login agar dapat melewati lagu. Saat Anda menggunakan error non-fatal, sistem dapat menyarankan agar pengguna login tanpa mengganggu pemutaran untuk item media saat ini.

Saat Anda mengeluarkan error non-fatal, pertahankan sisa PlaybackStateCompat sebagaimana adanya, selain kode error dan pesan error. Dengan pendekatan ini, pemutaran item media saat ini dapat dilanjutkan saat pengguna memutuskan apakah akan login atau tidak.

Jika pemutaran tidak dapat dilakukan, misalnya saat tidak ada koneksi internet dan tidak ada konten offline, tetapkan status PlaybackStateCompat ke STATE_ERROR.

Pada update berikutnya pada PlaybackStateCompat, hapus kode error dan pesan error agar tidak menampilkan beberapa peringatan untuk error yang sama.

Jika pada tahap mana pun Anda tidak dapat memuat hierarki penjelajahan—misalnya, jika Anda memerlukan autentikasi dan pengguna tidak login—kirim hierarki penjelajahan kosong. Untuk menandakan hal ini, tampilkan hasil null dari onLoadChildren() untuk node media root. Jika ini terjadi, sistem akan menampilkan error layar penuh dengan pesan error yang disetel di PlaybackStateCompat.

Error yang dapat ditindaklanjuti

Jika error dapat ditindaklanjuti, tetapkan dua tambahan berikut di PlaybackStateCompat:

Error yang dapat ditindaklanjuti muncul sebagai Dialog dan dapat diselesaikan oleh pengguna hanya ketika mobil berhenti.

Menguji kasus error

Pastikan bahwa aplikasi Anda menangani error dalam semua skenario dengan baik, termasuk:

  • Tingkat yang berbeda dari produk Anda: misalnya, gratis versus premium atau login versus logout.
  • Status mengemudi yang berbeda: misalnya, parkir versus mengemudi.
  • Status konektivitas yang berbeda: misalnya, online versus offline.

Pertimbangan lainnya

Ingatlah selalu hal-hal berikut ini saat mengembangkan aplikasi Android Automotive OS:

Konten offline

Jika berlaku, terapkan dukungan pemutaran offline. Mobil dengan Android Automotive OS diharapkan memiliki konektivitas datanya sendiri, yang berarti paket data disertakan dalam biaya kendaraan atau dibayar oleh pengguna. Namun, mobil juga diharapkan memiliki konektivitas yang lebih bervariasi daripada perangkat seluler.

Berikut beberapa hal yang perlu diperhatikan saat Anda mempertimbangkan strategi dukungan offline:

  • Waktu terbaik untuk mendownload konten adalah saat aplikasi Anda sedang digunakan.
  • Jangan berasumsi bahwa Wi-Fi tersedia. Mobil mungkin tidak pernah masuk ke dalam jangkauan Wi-Fi atau OEM mungkin telah menonaktifkan Wi-Fi dan mengutamakan jaringan seluler.
  • Meskipun Anda boleh meng-cache konten dengan cepat yang diharapkan pengguna untuk digunakan, sebaiknya Anda mengizinkan pengguna mengubah perilaku ini melalui aktivitas setelan Anda.
  • Kapasitas disk di mobil bervariasi, jadi beri pengguna cara untuk menghapus konten offline, seperti melalui opsi di aktivitas setelan Anda.

Dukungan WebView

WebView didukung di Android Automotive OS, tetapi hanya diizinkan untuk aktivitas setelan dan login Anda. Aktivitas yang menggunakan WebView harus memiliki kemampuan "tutup" atau "kembali" di luar WebView.

Berikut adalah beberapa contoh kasus penggunaan yang dapat diterima untuk WebView:

  • Menampilkan kebijakan privasi, persyaratan layanan, atau link terkait hukum lainnya dalam aktivitas setelan Anda.
  • Alur berbasis web dalam aktivitas login.

Saat menggunakan WebView, Anda dapat mengaktifkan JavaScript.

Mengamankan WebView Anda

Lakukan semua tindakan pencegahan yang dapat dilakukan untuk membantu memastikan bahwa WebView Anda bukan titik entri ke internet yang lebih besar. Lihat cuplikan kode berikut untuk contoh tentang cara mengunci WebView ke URL yang digunakan dalam panggilan loadUrl() dan mencegah pengalihan. Sebaiknya Anda menerapkan pengamanan seperti ini jika memungkinkan, seperti saat menampilkan link terkait hukum.

Kotlin

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Java

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

Nama paket

Karena mendistribusikan Android Package Kit (APK) terpisah untuk Android Automotive OS, Anda dapat menggunakan kembali nama paket dari aplikasi seluler atau membuat nama paket baru. Jika Anda menggunakan nama paket yang berbeda, aplikasi Anda memiliki dua listingan Play Store terpisah. Jika Anda menggunakan kembali nama paket saat ini, aplikasi Anda memiliki satu listingan di kedua platform.

Hal ini utamanya adalah keputusan bisnis. Misalnya, jika salah satu tim Anda sedang mengerjakan aplikasi seluler dan tim yang lain mengerjakan aplikasi Android Automotive OS, masuk akal untuk memiliki nama paket yang terpisah dan membiarkan setiap tim mengelola listingan Play Store-nya sendiri. Tidak ada perbedaan besar dalam upaya teknis yang diperlukan untuk menggunakan salah satu pendekatan tersebut.

Tabel berikut merangkum beberapa perbedaan utama lainnya antara menyimpan nama paket saat ini dan menggunakan nama paket baru:

Fitur Nama paket yang sama Nama paket baru
Listingan Play Store Satu Beberapa
Penginstalan yang dicerminkan Ya: “instal ulang aplikasi cepat” selama wizard penyiapan Tidak
Proses Peninjauan Play Store Memblokir ulasan: jika ulasan gagal untuk satu APK, APK lain yang dikirimkan dalam rilis yang sama akan diblokir Ulasan individual
Statistik, metrik, dan data vital Kombinasi: Anda dapat memfilter data khusus otomotif. Terpisah
Pengindeksan dan penentuan peringkat penelusuran Membangun dari reputasi saat ini Tidak ada peralihan
Mengintegrasikan dengan aplikasi lain Kemungkinan besar tidak diperlukan perubahan, dengan asumsi kode media dibagi di antara kedua APK Mungkin harus mengupdate aplikasi yang sesuai, seperti untuk pemutaran URI dengan Asisten Google.

Pertanyaan umum (FAQ)

Lihat bagian berikut untuk jawaban atas beberapa pertanyaan umum tentang Android Automotive OS.

Hardware

Dapatkah aplikasi saya mendapatkan akses ke mikrofon

Untuk aplikasi yang menargetkan Android 10 (level API 29) atau yang lebih baru, lihat dokumentasi berbagi input audio. Hal ini tidak dapat dilakukan sebelum level API 29.

API mobil mana yang dapat kami akses dan bagaimana caranya?

Anda dibatasi untuk API yang diekspos oleh OEM. Proses sedang dikembangkan untuk menstandarkan cara Anda mengakses API ini.

Aplikasi dapat mengakses API mobil menggunakan SetProperty() dan GetProperty() pada CarPropertyManager. Lihat kode sumber atau dokumentasi referensi untuk melihat daftar semua properti yang tersedia. Jika properti dianotasi dengan @SystemApi, properti akan dibatasi untuk aplikasi sistem pramuat.

Tipe codec audio apa yang didukung?

Lihat detail codec audio di Android CDD.

Apakah DRM Widevine didukung?

Ya. DRM Widevine didukung.

Pengembangan dan pengujian

Apakah ada batasan atau rekomendasi untuk menggunakan SDK dan library pihak ketiga?

Kami tidak memiliki pedoman khusus tentang penggunaan SDK dan library pihak ketiga. Jika memilih untuk menggunakan SDK dan library pihak ketiga, Anda tetap bertanggung jawab untuk mematuhi semua persyaratan kualitas aplikasi mobil.

Dapatkah saya menggunakan layanan latar depan?

Satu-satunya kasus penggunaan yang diizinkan untuk layanan latar depan adalah mendownload konten untuk penggunaan offline. Jika Anda memiliki kasus penggunaan lain untuk layanan latar depan yang ingin dilihat dukungannya, hubungi kami menggunakan grup diskusi Android Automotive OS.

Memublikasikan aplikasi Android Automotive OS

Bagaimana cara memublikasikan aplikasi Android Automotive OS menggunakan Konsol Google Play?

Proses publikasi aplikasi mirip dengan memublikasikan aplikasi ponsel, tetapi Anda menggunakan faktor bentuk yang berbeda. Untuk mengikutsertakan aplikasi Anda menggunakan faktor bentuk Android Automotive OS, ikuti langkah-langkah berikut:

  1. Buka Konsol Play.
  2. Pilih aplikasi Anda.
  3. Dari menu kiri, klik Rilis > Penyiapan > Setelan lanjutan > Faktor bentuk.
  4. Klik Tambahkan faktor bentuk > Android Automotive OS, lalu ikuti petunjuk di Konsol Play.

Referensi lainnya

Untuk mempelajari Android Automotive OS lebih lanjut, lihat referensi tambahan berikut.

Contoh

Panduan

Blog

Video

Melaporkan masalah Media Android Automotive OS

Jika mengalami masalah dengan pengembangan aplikasi media untuk Android Automotive OS, Anda dapat melaporkannya menggunakan Issue Tracker Google. Pastikan untuk mengisi semua informasi yang diminta pada template masalah.

Laporkan masalah baru

Sebelum mengajukan masalah baru, periksa apakah masalah tersebut sudah dilaporkan dalam daftar masalah. Anda bisa berlangganan dan memberi suara pada masalah dengan mengklik bintang untuk masalah di tracker. Untuk mengetahui informasi selengkapnya, lihat Berlangganan pada topik Masalah.