Mengontrol media melalui MediaSession

Terakhir Diperbarui: 22-01-2020

Apa manfaat menambahkan MediaSession pada pemutaran video?

Sesi media merupakan link yang tidak terpisahkan antara platform Android dan aplikasi media. Sesi media tidak hanya menginformasikan Android bahwa media sedang diputar—sehingga dapat meneruskan tindakan media ke sesi yang benar—tetapi juga menginformasikan platform tentang konten yang sedang diputar dan cara mengontrolnya.

Mengekspos MediaSession melalui aplikasi Anda memiliki beragam manfaat yang akan dinikmati pengguna. Berikut adalah beberapa contoh yang sangat bagus.

Asisten Google

Pengguna bisa dengan mudah berinteraksi dengan media di aplikasi Anda melalui perintah suara seperti "Jeda", "Lanjutkan", dan "Berikutnya". Metadata dari media Anda juga dapat digunakan untuk mendapatkan jawaban dari konten yang sedang diputar.

Android TV

Pada pengalaman layar lebar, aplikasi Android TV dapat menggunakan remote control konvensional bagi pengguna dengan TV yang mendukung HDMI-CEC. Perintah yang dikeluarkan oleh tombol putar/jeda, berhenti, berikutnya, dan sebelumnya akan disampaikan ke aplikasi Anda.

Kontrol media di layar

Mulai dari Android 4.0 (API level 14), sistem dapat mengakses status dan metadata pemutaran sesi media. Fungsi ini memungkinkan layar kunci menampilkan kontrol media dan karya seni. Perilaku ini bervariasi, bergantung pada versi Android.

Media Latar Belakang

Media dapat dikontrol dalam salah satu skenario ini meskipun aplikasi yang memutar media sedang berjalan di latar belakang.

Komputasi sekitar

Mengekspos media dengan data tentang konten yang sedang diputar dan cara mengontrolnya dapat menjadi jembatan antarperangkat sehingga pengguna dapat berinteraksi dengan beragam konten yang disukainya.

Yang akan Anda buat

Dalam codelab ini, Anda akan memperluas sampel Exoplayer yang sudah ada untuk menambahkan dukungan sesi media. Aplikasi Anda akan:

  • Menunjukkan status aktif sesi media dengan benar
  • Menyampaikan kontrol media ke ExoPlayer
  • Meneruskan metadata item dalam antrean ke sesi media

Yang akan Anda pelajari

  • Alasan sesi media menawarkan pengalaman yang lebih kaya kepada pengguna
  • Cara membuat sesi media dan mengelola statusnya
  • Cara menghubungkan sesi media ke ExoPlayer
  • Cara menyertakan metadata item dalam antrean pemutaran di sesi media
  • Cara menambahkan tindakan tambahan (kustom)

Codelab ini berfokus pada MediaSesi SDK. Konsep dan blok kode yang tidak relevan, seperti detail implementasi ExoPlayer, tidak akan dibahas, tetapi disediakan bagi Anda agar dapat dengan mudah menyalin dan menempel.

Yang akan Anda butuhkan

  • Versi terbaru Android Studio (versi 3.5 atau yang lebih baru)
  • Pengetahuan dasar tentang pengembangan aplikasi Android

Apa yang menjadi titik awal?

Titik awal adalah demo utama dari ExoPlayer. Demo ini berisi video dengan kontrol pemutaran di layar, tetapi tidak menggunakan sesi media secara langsung. Tempat ini tepat bagi kami untuk membahas dan menambahkannya.

Mendapatkan sampel ExoPlayer

Sebagai permulaan, mari kita mulai dengan sampel ExoPlayer. Gandakan repositori GitHub dari link di bawah ini.

Menggandakan sampel ExoPlayer

Membuka demo

Di Android Studio, buka project demo utama yang terletak di bagian demos/main.

Android Studio akan meminta Anda menyetel jalur SDK. Anda mungkin ingin mengikuti saran untuk mengupdate IDE dan SDK Tools jika mengalami masalah.

Jika Anda diminta untuk menggunakan versi Gradle terbaru, lanjutkan lalu update.

Luangkan waktu untuk mendapatkan pemahaman dasar tentang cara aplikasi tersebut dirancang. Perhatikan bahwa ada dua aktivitas: SampleChooserActivity dan PlayerActivity. Kami akan menghabiskan sisa codelab di PlayerActivity, tempat pemutaran media yang sebenarnya. Jadi, buka kelas ini dan lanjutkan ke bagian berikutnya.

Membuat sesi media

Buka PlayerActivity.java Class ini membuat ExoPlayer dan mengelola berbagai fungsinya, seperti merender video ke layar. Dalam aktivitas ini, kami akan menghubungkan ExoPlayer ke sesi media.

Deklarasikan dua kolom berikut di bagian atas class. Kami akan menggunakan kolom ini di seluruh bagian ini.

private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;

Anda perlu menambahkan dependensi project "extension-mediasession" ke dalam tingkat modul build.gradle untuk "Module: demo":

implementation project(path: ':extension-mediasession')

Perhatikan bahwa Android Studio dapat membantu menambahkan dependensi ini secara otomatis jika Anda mengarahkan mouse ke error dengan menyelesaikan MediaSessionConnector:

Terakhir, selesaikan impor class dengan menambahkan kode berikut:

import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;

Saat aktivitas dibuat, kami ingin membuat sesi media dan konektor sesi media yang berfungsi sebagai perantara antara sesi media dan ExoPlayer.

Tempat yang ideal untuk menyisipkan ini adalah tempat pembuatan ExoPlayer. Di aplikasi demo, kita dapat menambahkan kode di akhir initializePlayer(). Pastikan untuk menambahkan logika ini setelah instance pemutar dibuat.

private void initializePlayer() {
  if (player == null) {
    ...
    player = ...
    ...
    mediaSession = new MediaSessionCompat(this, "sample");
    mediaSessionConnector = new MediaSessionConnector(mediaSession);
    mediaSessionConnector.setPlayer(player);
  }
  ...
}

Merilis sesi media

Rilis sesi media jika tidak diperlukan lagi. Saat merilis ExoPlayer di releasePlayer(), kami juga dapat menyertakan kode berikut untuk melakukannya:

private void releasePlayer() {
  if (mediaSession != null) {
    mediaSession.release();
  }
  ...
}

Mengelola status sesi media

Setelah membuat instance sesi media, kami harus memastikan bahwa statusnya terlihat dengan benar saat pengguna berinteraksi dengan aktivitas tersebut.

Saat pengguna memulai aktivitas, status sesi media akan menjadi aktif:

@Override
public void onStart() {
  ...
  if (mediaSession != null) {
    mediaSession.setActive(true);
  }
}

Penting untuk memastikan bahwa status sesi media menjadi tidak aktif saat pengguna meninggalkan aktivitas karena aplikasi kami tidak memutar media di latar belakang:

@Override
public void onStop() {
  super.onStop();
  if (mediaSession != null) {
    mediaSession.setActive(false);
  }
  ...
}

Mari jalankan demo

  1. Pasang perangkat Android atau mulai emulator.
  2. Pastikan Anda memilih "demo" untuk dijalankan dari toolbar Android Studio.
  3. Klik dari toolbar Android Studio.
  4. Setelah aplikasi diluncurkan di perangkat, pilih streaming video untuk diputar.
  5. Setelah pemutaran dimulai, jelajahi menggunakan perintah adb berikut untuk mengontrol sesi media:
    adb shell media dispatch pause
    adb shell media dispatch play
    adb shell media dispatch play-pause
    adb shell media dispatch fast-forward
    adb shell media dispatch rewind
  1. Pelajari juga cara Android melihat sesi media Anda dengan mengeksekusi:
    adb shell dumpsys media_session
  2. Jika Anda menggunakan perangkat fisik dengan mikrofon, coba panggil Asisten Google dan beri perintah suara, seperti:
    "Jeda."
    "Lanjutkan."
    "Maju cepat 1 menit."


Sampel ExoPlayer yang berjalan di Android TV.

Sekarang kami dapat memperluas fitur yang didukung dari sesi media tempat kami membuat MediaSessionConnector di initializePlayer() sebelumnya.

Menambahkan TimelineQueueNavigator

ExoPlayer menampilkan struktur media sebagai linimasa. Untuk mengetahui detail cara kerjanya, luangkan waktu untuk membaca objek Linimasa ExoPlayer. Dengan mengetuk struktur ini, kami akan mendapatkan informasi saat konten berubah dan menampilkan metadata dari konten yang sedang diputar jika diminta.

Untuk melakukan ini, kami akan menentukan TimelineQueueNavigator. Cari pembuatan instance MediaSessionConnector di initializePlayer() dan tambahkan implementasi TimelineQueueNavigator setelah mediaSession diinisialisasi.

mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
  @Override
  public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
    return new MediaDescriptionCompat.Builder()
            .setTitle("MediaDescription title")
            .setDescription("MediaDescription description for " + windowIndex)
            .setSubtitle("MediaDescription subtitle")
            .build();
  }
});

Selesaikan impor class dengan menambahkan:

import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;

Amati bahwa parameter windowIndex sesuai dengan item indeks di antrean pemutaran.

Kini setelah menambahkan beberapa metadata, Anda dapat menguji apakah Asisten memahami konten yang sedang diputar atau tidak. Saat memutar video di Android TV, panggil Asisten dan tanyakan "Apa yang sedang diputar?"

Pemutar Anda mungkin tidak mendukung beberapa tindakan, atau Anda ingin menyertakan dukungan untuk tindakan lainnya? Sekarang mari bahas lebih dalam tentang sesi media tempat kami membuat MediaSessionConnector di initializePlayer() sebelumnya.

Mendeklarasikan tindakan yang didukung

Coba gunakan mediaSessionConnector.setEnabledPlaybackActions() untuk menyesuaikan tindakan yang ingin didukung oleh sesi media.

Perhatikan bahwa kumpulan lengkapnya adalah:

mediaSessionConnector.setEnabledPlaybackActions(
        PlaybackStateCompat.ACTION_PLAY_PAUSE
                | PlaybackStateCompat.ACTION_PLAY
                | PlaybackStateCompat.ACTION_PAUSE
                | PlaybackStateCompat.ACTION_SEEK_TO
                | PlaybackStateCompat.ACTION_FAST_FORWARD
                | PlaybackStateCompat.ACTION_REWIND
                | PlaybackStateCompat.ACTION_STOP
                | PlaybackStateCompat.ACTION_SET_REPEAT_MODE
                | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);

Mari lihat kembali cara data ini terekspos ke platform:

  1. Seperti sebelumnya, mulai video.
  2. Pelajari cara Android melihat metadata dari sesi media Anda dengan menjalankan:
    adb shell dumpsys media_session
  3. Cari baris yang berisi metadata dan amati bahwa judul dan deskripsi disertakan dan berhubungan dengan com.google.android.exoplayer2.demo/sample.

Menambahkan tindakan tambahan

Kami dapat memperluas sesi media dengan beberapa tindakan tambahan. Di bagian ini, kami hanya akan menambahkan dukungan untuk teks.

Teks pendukung

Menambahkan dukungan untuk teks ke sesi media memungkinkan pengguna untuk mengalihkannya dengan suara. Jika Anda telah menginisialisasi konektor sesi media, tambahkan hal berikut:

mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
      @Override
      public void onSetCaptioningEnabled(Player player, boolean enabled) {
        Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
      }

      @Override
      public boolean hasCaptions(Player player) {
        return true;
      }

      @Override
      public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
        return false;
      }
    }
);

Terakhir, selesaikan semua impor yang hilang.

Anda dapat mengujinya dengan mengaktifkan Asisten Google di Android TV dan mengucapkan "Aktifkan teks". Periksa Logcat pesan untuk melihat cara perintah ini memanggil kode Anda.

Selamat, Anda telah berhasil menambahkan sesi media ke sampel.

Anda mendapatkan banyak sekali fungsi dengan:

  • menambahkan sesi media,
  • menghubungkan sesi media ke instance ExoPlayer,
  • menambahkan metadata dan tindakan tambahan.

Sekarang Anda sudah mengetahui langkah-langkah penting yang diperlukan untuk memperkaya aplikasi media dan menawarkan pengalaman yang lebih fleksibel kepada pengguna.

Komentar terakhir

Codelab ini dibuat berdasarkan sampel dari kode sumber ExoPlayer. Anda tidak lagi perlu menggunakan ExoPlayer dari sumber, dan sebaiknya Anda menarik dependensi untuk ExoPlayer dan MediaSessionConnector agar lebih mudah mengikuti rilis terbaru.

Untuk melakukan ini, cukup ganti dependensi project seperti:

implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')

untuk mengambil dari repositori Maven, seperti:

implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'

Dokumen referensi