Mengaktifkan kontrol pemutaran

Untuk mengaktifkan pemutaran media di Android Auto dan Android Automotive OS (AAOS), terapkan kontrol pemutaran dengan mendaftarkan sesi media dan menangani metode callback-nya. Laman ini menjelaskan cara:

  • Daftarkan objek MediaSessionCompat di layanan browser media Anda.

  • Terapkan metode MediaSessionCompat.Callback untuk merespons permintaan pemutaran pengguna.

  • Mengonfigurasi tindakan pemutaran standar dan kustom.

  • Tetapkan status pemutaran awal untuk sesi media Anda.

  • Tambahkan ikon untuk menunjukkan format audio.

  • Membuat link dari item media yang sedang diputar.

Android Auto dan AAOS mengirimkan perintah kontrol pemutaran melalui MediaSessionCompat untuk layanan Anda. Anda harus mendaftarkan sesi dan menerapkan metode callback yang terkait.

Mendaftarkan sesi media

Dalam metode onCreate layanan browser media Anda, buat instance MediaSessionCompat, lalu panggil setSessionToken untuk mendaftarkan sesi media. Cuplikan kode ini menunjukkan cara membuat dan mendaftarkan sesi media:

Kotlin

override fun onCreate() {
    super.onCreate()
    ...
    // Start a new MediaSession.
    val session = MediaSessionCompat(this, "session tag").apply {
        // Set a callback object that implements MediaSession.Callback
        // to handle play control requests.
        setCallback(MyMediaSessionCallback())
    }
    sessionToken = session.sessionToken
    ...
}

Java

public void onCreate() {
    super.onCreate();
    ...
    // Start a new MediaSession.
    MediaSessionCompat session = new MediaSessionCompat(this, "session tag");
    setSessionToken(session.getSessionToken());

    // Set a callback object that implements MediaSession.Callback
    // to handle play control requests.
    session.setCallback(new MyMediaSessionCallback());
    ...
}

Saat Anda membuat objek sesi media, tetapkan objek callback yang digunakan untuk menangani permintaan kontrol pemutaran. Objek ini dibuat dengan memberikan implementasi class MediaSessionCompat.Callback untuk aplikasi Anda. Bagian selanjutnya membahas cara mengimplementasikan objek ini.

Mengimplementasikan perintah putar

Saat pengguna meminta pemutaran untuk item media dari aplikasi Anda, Android Automotive OS dan Android Auto menggunakan class MediaSessionCompat.Callback dari objek MediaSessionCompat aplikasi Anda yang diperoleh dari layanan browser media aplikasi Anda. Saat pengguna ingin mengontrol pemutaran konten, seperti menjeda pemutaran atau melewati ke lagu berikutnya, Android Auto dan Android Automotive OS akan memanggil salah satu metode objek callback.

Untuk menangani pemutaran konten, aplikasi Anda harus memperluas class MediaSessionCompat.Callback abstrak dan mengimplementasikan metode yang didukung aplikasi Anda.

Implementasikan setiap metode callback berikut yang sesuai untuk jenis konten yang ditawarkan oleh aplikasi Anda:

onPrepare
AAOS memanggil metode ini saat sumber media berubah.
onPlay

Dipanggil saat pengguna memilih putar tanpa memilih item tertentu. Aplikasi Anda harus memutar konten defaultnya atau, jika pemutaran dijeda dengan onPause, aplikasi Anda akan melanjutkan pemutaran.

onPlayFromMediaId

Dipanggil saat pengguna memilih untuk memutar item tertentu. Metode ini menerima ID yang ditetapkan layanan browser media Anda ke item media dalam hierarki konten.

onPlayFromSearch

Dipanggil saat pengguna memilih untuk memutar item media dari kueri penelusuran. Aplikasi harus membuat pilihan yang tepat berdasarkan string penelusuran yang diteruskan.

onPause

Dipanggil saat pengguna memilih untuk menjeda pemutaran.

onSkipToNext

Dipanggil saat pengguna memilih untuk melompat ke item berikutnya.

onSkipToPrevious

Dipanggil saat pengguna memilih untuk melompat ke item sebelumnya.

onStop

Dipanggil saat pengguna memilih untuk menghentikan pemutaran. Ganti metode ini di aplikasi Anda untuk memberikan hasil yang dipilih. Anda tidak perlu mengimplementasikan metode jika tujuannya tidak didukung oleh aplikasi Anda. Misalnya, jika aplikasi Anda memutar livestream, seperti siaran olahraga, Anda tidak perlu mengimplementasikan onSkipToNext. Sebagai gantinya, gunakan implementasi default onSkipToNext.

Aplikasi Anda tidak memerlukan logika khusus untuk memutar konten melalui speaker mobil. Saat menerima permintaan untuk memutar konten, aplikasi Anda akan memutar audio dengan cara yang sama seperti konten diputar melalui speaker ponsel atau headphone pengguna. Android Auto dan AAOS akan otomatis mengirim konten audio ke sistem mobil untuk diputar melalui speaker mobil.

Untuk mempelajari lebih lanjut cara memutar konten audio, lihat Ringkasan Media Player, Ringkasan aplikasi audio, dan ringkasan ExoPlayer.

Menetapkan tindakan pemutaran standar

Android Auto dan AAOS menampilkan kontrol pemutaran berdasarkan tindakan yang diaktifkan dalam objek PlaybackStateCompat. Secara default, aplikasi Anda harus mendukung tindakan berikut:

Aplikasi Anda mungkin juga mendukung tindakan berikut jika relevan dengan konten aplikasi:

Selain itu, Anda dapat secara opsional membuat antrean pemutaran untuk ditampilkan kepada pengguna. Untuk melakukannya, panggil metode setQueue dan setQueueTitle, aktifkan tindakan ACTION_SKIP_TO_QUEUE_ITEM, dan tentukan callback onSkipToQueueItem.

Selain itu, tambahkan dukungan untuk ikon Now playing, yang merupakan indikator untuk item yang sedang diputar. Untuk melakukannya, panggil metode setActiveQueueItemId dan teruskan ID item yang sedang diputar dalam antrean. Anda harus memperbarui setActiveQueueItemId setiap kali ada perubahan antrean.

Android Auto dan AAOS menampilkan tombol untuk setiap tindakan yang diaktifkan serta antrean pemutaran. Saat pengguna mengklik tombol ini, sistem akan memanggil callback yang sesuai dari MediaSessionCompat.Callback.

Mencadangkan ruang yang tidak terpakai

Android Auto dan AAOS mencadangkan ruang pada UI untuk tindakan ACTION_SKIP_TO_PREVIOUS dan ACTION_SKIP_TO_NEXT. Jika aplikasi Anda tidak mendukung salah satu fungsi tersebut, Android Auto dan AAOS akan menggunakan ruang itu untuk menampilkan tindakan kustom apa pun yang Anda buat.

Jika tidak ingin mengisi ruang tersebut dengan tindakan kustom, Anda dapat mencadangkannya sehingga Android Auto dan AAOS mengosongkan ruang itu setiap kali aplikasi Anda tidak mendukung fungsi yang sesuai.

Untuk melakukannya, panggil metode setExtras dengan paket tambahan yang berisi konstanta yang terkait dengan fungsi yang dicadangkan. SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT sesuai dengan ACTION_SKIP_TO_NEXT, dan SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV sesuai dengan ACTION_SKIP_TO_PREVIOUS. Gunakan konstanta ini sebagai kunci dalam paket, dan gunakan boolean true sebagai nilai.

Menetapkan PlaybackState awal

Saat Android Auto dan AAOS berkomunikasi dengan layanan browser media Anda, sesi media Anda mengomunikasikan status pemutaran konten menggunakan PlaybackStateCompat.

Aplikasi Anda tidak boleh otomatis mulai memutar musik saat AAOS atau Android Auto terhubung ke layanan browser media Anda. Sebagai gantinya, andalkan Android Auto dan AAOS untuk melanjutkan atau memulai pemutaran berdasarkan keadaan mobil atau tindakan pengguna.

Untuk melakukannya, tetapkan PlaybackStateCompat awal sesi media ke STATE_STOPPED, STATE_PAUSED, STATE_NONE, atau STATE_ERROR.

Sesi media dalam Android Auto dan AAOS hanya berlangsung selama durasi perjalanan, sehingga pengguna sering memulai dan menghentikan sesi ini. Untuk mempromosikan pengalaman yang lancar di antara perjalanan, lacak status sesi pengguna sebelumnya, sehingga saat aplikasi media menerima permintaan melanjutkan, pengguna dapat secara otomatis melanjutkan dari posisi terakhir yang mereka tinggalkan. Misalnya, item media yang terakhir diputar, PlaybackStateCompat, dan antrean.

Menambahkan tindakan pemutaran kustom

Anda dapat menambahkan tindakan pemutaran kustom untuk menampilkan tindakan tambahan yang didukung aplikasi media Anda. Jika ruangnya memungkinkan (dan Anda tidak mencadangkannya), Android akan menambahkan tindakan kustom ke kontrol transport. Jika tidak, tindakan kustom akan muncul di menu Overflow. Android menampilkan tindakan kustom dalam urutan Anda menambahkannya ke PlaybackStateCompat.

Gunakan tindakan kustom untuk menyediakan perilaku yang berbeda dengan tindakan standar. Jangan menggunakannya untuk mengganti atau menduplikasi tindakan standar.

Untuk menambahkan tindakan kustom, gunakan metode addCustomAction di class PlaybackStateCompat.Builder. Cuplikan kode ini menunjukkan cara menambahkan tindakan kustom ke "Mulai saluran radio":

Kotlin

val customActionExtras = Bundle()
customActionExtras.putInt(
  androidx.media3.session.MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT,
  androidx.media3.session.CommandButton.ICON_RADIO)

stateBuilder.addCustomAction(
    PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon // or R.drawable.media3_icon_radio
    ).run {
        setExtras(customActionExtras)
        build()
    }
)

Java

Bundle customActionExtras = new Bundle();
customActionExtras.putInt(
  androidx.media3.session.MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT,
  androidx.media3.session.CommandButton.ICON_RADIO);

stateBuilder.addCustomAction(
    new PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon) // or R.drawable.media3_icon_radio
    .setExtras(customActionExtras)
    .build());

Untuk contoh selengkapnya dari metode ini, lihat metode setCustomAction pada aplikasi contoh Universal Android Music Player di GitHub. Setelah Anda membuat tindakan kustom, sesi media Anda dapat merespons tindakan tersebut dengan mengganti metode onCustomAction.

Cuplikan kode ini menunjukkan cara aplikasi Anda merespons tindakan "Mulai saluran radio":

Kotlin

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA -> {
            ...
        }
    }
}

Java

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_START_RADIO_FROM_MEDIA.equals(action)) {
        ...
    }
}

Untuk mempelajari lebih lanjut, lihat metode onCustomAction di aplikasi contoh Universal Android Music Player di GitHub.

Membuat ikon untuk tindakan kustom

Setiap tindakan kustom yang Anda buat memerlukan ikon.

Jika deskripsi ikon tersebut cocok dengan salah satu konstanta CommandButton.ICON_, tetapkan nilai bilangan bulat untuk kunci EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT dari ekstra tindakan kustom. Pada sistem yang didukung, tindakan ini akan menggantikan resource ikon yang diteruskan ke CustomAction.Builder, sehingga komponen sistem dapat merender tindakan Anda dan tindakan pemutaran lainnya secara konsisten.

Anda juga harus menentukan resource ikon. Aplikasi untuk mobil dapat berjalan di berbagai ukuran dan kepadatan layar, sehingga ikon yang Anda sediakan harus berupa vector drawable. Gunakan vektor drawable untuk mengubah skala aset tanpa kehilangan detail. Vektor drawable dapat menyelaraskan tepi dan sudut dengan batas piksel pada resolusi yang lebih kecil.

Jika tindakan kustom bersifat stateful (jika tindakan ini mengaktifkan atau menonaktifkan setelan pemutaran), berikan ikon yang berbeda untuk status yang berbeda guna membantu pengguna melihat perubahan saat mereka memilih tindakan.

Menyediakan gaya ikon alternatif untuk tindakan yang dinonaktifkan

Apabila tindakan kustom tidak tersedia untuk konteks yang sedang aktif, tukar ikon tindakan kustom dengan ikon alternatif yang menunjukkan bahwa tindakan dinonaktifkan.

Contoh ikon tindakan kustom gaya tidak aktif.
Gambar 1. Contoh ikon tindakan kustom gaya tidak aktif.

Menunjukkan format audio

Untuk menunjukkan bahwa media yang sedang diputar menggunakan format audio khusus, Anda dapat menentukan ikon yang dirender di mobil yang mendukung fitur ini. Anda dapat menyetel KEY_CONTENT_FORMAT_TINTABLE_LARGE_ICON_URI dan KEY_CONTENT_FORMAT_TINTABLE_SMALL_ICON_URI dalam paket tambahan dari item media yang saat ini diputar (diteruskan ke MediaSession.setMetadata). Tetapkan kedua tambahan untuk mengakomodasi tata letak yang berbeda.

Selain itu, Anda dapat menyetel tambahan KEY_IMMERSIVE_AUDIO untuk memberi tahu OEM mobil bahwa ini adalah audio imersif, dan OEM harus sangat berhati-hati saat memutuskan apakah akan menerapkan efek audio yang mungkin mengganggu konten yang imersif.

Anda dapat mengonfigurasi item media yang sedang diputar agar subtitel, deskripsi, atau keduanya merupakan link ke item media lain. Hal tersebut memungkinkan pengguna dengan cepat menuju item terkait; misalnya, pengguna dapat melompat ke lagu lain dari artis yang sama atau ke episode lain dari podcast. Jika mobil mendukung fitur ini, pengguna dapat mengetuk link untuk menjelajahi konten tersebut.

Untuk menambahkan link, konfigurasi metadata KEY_SUBTITLE_LINK_MEDIA_ID (untuk menautkan dari subtitel) atau KEY_DESCRIPTION_LINK_MEDIA_ID (untuk menautkan dari deskripsi). Untuk mengetahui detailnya, baca dokumentasi referensi untuk kolom metadata tersebut.