Audio Latar di Android Menggunakan MediaSessionCompat
Indonesian (Bahasa Indonesia) translation by Yanti Baddolo (you can also view the original English article)
Salah satu penggunaan populer alat seluler adalah memutar ulang audio melalui layanan pemutaran musik, podcast yang diunduh, atau sejumlah sumber audio lainnya. Meskipun fitur ini cukup umum, namun ternyata sulit diterapkan, ditambah dengan banyaknya bagian berbeda yang perlu dibangun dengan benar untuk memberi pengalaman Android kepada pengguna Anda sepenuhnya.
Melalui tutorial ini anda akan belajar mengenai MediaSessionCompat
dari perpustakaan pendukung Android, dan bagaimana ini dapat digunakan untuk membuat latar audio yang benar untuk pengguna Anda.
Persiapan
Hal pertama yang perlu Anda lakukan adalah memasukkan Perpustakaan pendukung Android kedalam proyek Anda. Hal ini bisa dilakukan dengan menambahkan baris berikut kedalam file modul build.gradle Anda dibawah node dependensi.
compile 'com.android.support:support-v13:24.2.1'
Setelah proyek Anda tersinkronisasi, buatlah kelas Java baru. Sebagai contoh saya akan memanggil BackgroundAudioService
. Kelas ini akan membutuhkan ekstensi MediaBrowserServiceCompat
. Kita juga akan menerapkan antarmuka dibawah ini: MediaPlayer.OnCompletionListener
dan AudioManager.OnAudioFocusChangeListener
.
Karna sekarang penerapan MediaBrowserServiceCompat
Anda telah dibuat, mari melakukan update terlebih dahulu pada AndroidManifest.xml sebelum kembali kekelas ini. Pertama, Anda perlu meminta persetujuan WAKE_LOCK
.
<uses-permission android:name="android.permission.WAKE_LOCK" />
Selanjutnya dalam node application
nyatakan layanan baru anda dengan item intent-filter.
Ini akan memungkinkan layanan Anda mencegat tombol kontrol, aktivitas headphone, dan penjelajahan media untuk perangkat seperti Android Auto ( meskipun kita tidak akan membahas Android Auto pada tutorial ini, beberapa pendukung dasar untukya masih dibutuhkan oleh MediaBrowserServiceCompat
).
<service android:name=".BackgroundAudioService"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> <action android:name="android.media.AUDIO_BECOMING_NOISY" /> <action android:name="android.media.browse.MediaBrowserService" /> </intent-filter> </service>
Pada akhirnya, Anda akan perlu menyatakan penggunaan MediaButtonReceiver
dari perpustakaan pendukung Android. Ini akan mengijinkan Anda mencegat interaksi-interaksi tombol kontrol media dan aktifitas headphone pada perangkat yang menjalankan Kitkat atau versi sebelumnya.
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> <action android:name="android.media.AUDIO_BECOMING_NOISY" /> </intent-filter> </receiver>
Sekarang file AndroidManifest.xml Anda telah selesai dan dapat ditutup. Kita akan membuat kelas lainnya bernama MediaStyleHelper
, yang ditulis oleh Ian Lake, Advokat pengembang di Google, untuk membersihkan pembuatan notifikasi jenis media.
public class MediaStyleHelper { /** * Build a notification using the information from the given media session. Makes heavy use * of {@link MediaMetadataCompat#getDescription()} to extract the appropriate information. * @param context Context used to construct the notification. * @param mediaSession Media session to get information. * @return A pre-built notification with information from the given media session. */ public static NotificationCompat.Builder from( Context context, MediaSessionCompat mediaSession) { MediaControllerCompat controller = mediaSession.getController(); MediaMetadataCompat mediaMetadata = controller.getMetadata(); MediaDescriptionCompat description = mediaMetadata.getDescription(); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder .setContentTitle(description.getTitle()) .setContentText(description.getSubtitle()) .setSubText(description.getDescription()) .setLargeIcon(description.getIconBitmap()) .setContentIntent(controller.getSessionActivity()) .setDeleteIntent( MediaButtonReceiver.buildMediaButtonPendingIntent(context, PlaybackStateCompat.ACTION_STOP)) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); return builder; } }
Begitu selesai dibuat, teruskan dan tutup file tersebut. Kita akan fokus pada pelayanan audio latar dibagian selanjutnya.
Membangun Pelayanan Audio Latar
Sekarang waktunya menggali inti dari pembuatan media aplikasi Anda. Ada beberapa Variabel anggota yang akan Anda inginkan untuk dinyatakan pertama-tama pada aplikasi sampel ini: sebuah pemutar media/ MediaPlayer
untuk pemutaran sebenarnya, dan objek MediaSessionCompat
Yang akan mengatur kontrol metadata dan pemutaran.
private MediaPlayer mMediaPlayer; private MediaSessionCompat mMediaSessionCompat;
Sebagai tambahan, Anda akan membutuhkan BroadcastReceiver
yang mendengarkan perubahan pada mode headphone. Untuk membuatnya tetap sederhana, penerima ini akan membuat MediaPlayer
dalam kondisi pause, jika ia sedang dijakankan.
private BroadcastReceiver mNoisyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if( mMediaPlayer != null && mMediaPlayer.isPlaying() ) { mMediaPlayer.pause(); } } };
Untuk variabel anggota yang terakhir, Anda akan membuat objek MediaSessionCompat.Callback
, yang digunakan untuk mengendalikan kondisi pemutaran ketika ada aksi sesi media.
private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() { @Override public void onPlay() { super.onPlay(); } @Override public void onPause() { super.onPause(); } @Override public void onPlayFromMediaId(String mediaId, Bundle extras) { super.onPlayFromMediaId(mediaId, extras); } };
Kita akan mengunjungi kembali setiap dari metode diatas nantinya pada tutorial ini, sebagai mana ia akan digunakan untuk mengarahkan operasi di palikasi kita.
Terdapat dua metode yang akan perlu dinyatakan, meski hal ini tidak akan dibutuhkan falam keperluan tutorial: onGetRoot()
dan onLoadChildren()
. Anda bisa menggunakan kode dibawah ini untuk kembali defaults.
@Nullable @Override public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { if(TextUtils.equals(clientPackageName, getPackageName())) { return new BrowserRoot(getString(R.string.app_name), null); } return null; } //Not important for general audio service, required for class @Override public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) { result.sendResult(null); }
Terakhir, Anda akan lebih banyak memakai metode onStartCommand()
, yang mana merupakan titik masuk kedalam Service
Anda. Metode ini akan mengambil tujuan yang sesuai dengan Layanan/Service dan mengirimkannya ke kelasMediaButtonReceiver.
@Override public int onStartCommand(Intent intent, int flags, int startId) { MediaButtonReceiver.handleIntent(mMediaSessionCompat, intent); return super.onStartCommand(intent, flags, startId); }
Menginisialisasi Keseluruhan
Sekarang variabel anggota dasar anda telah dibuat dan saatnya untuk menginisialisasi semuanya. Kita akan melakukannya dengan memanggil beragam metode penolong di onCreate().
@Override public void onCreate() { super.onCreate(); initMediaPlayer(); initMediaSession(); initNoisyReceiver(); }
Metode pertama, initMediaPlayer()
, akan menginisialisasi objek MediaPlayer
yang kita buat pada bagian atas kelas, meminta kunci pembangun parsial ( itulah kenapa kita meminta izin di AndroidManifest.xml), dan mengatur volume pemutar.
private void initMediaPlayer() { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setVolume(1.0f, 1.0f); }
Metode selanjutnya, initMediaSession()
,adalah dimana kita menginisialisasi objek MediaSessionCompat
dan menyambungkanna ke tombol media metode kontrol yang mengijinkan kita menangani input pengguna dan pemutaran. Metode ini dimulai dengan membuat objek ComponentName
yang menunjuk ke kelas MediaButtonReceiver
di perpustakaan pendukung Android, dan menggunakannya untuk membuat MediaSessionCompat
yang baru. Kemudian kita akan melewatkan objek MediaSession.Callback
yang telah dibuat sebelumnya kedalamnya, dan mengatur kebutuhan bendere untuk menerima input tombol media dan sinyal kontrol. Selanjutnya, kita akan membuat Intent
baru untuk menangani input tombol media pada perangkat sebelum Lollipop, dan mengatur token sesi media untuk layanan kita.
private void initMediaSession() { ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class); mMediaSessionCompat = new MediaSessionCompat(getApplicationContext(), "Tag", mediaButtonReceiver, null); mMediaSessionCompat.setCallback(mMediaSessionCallback); mMediaSessionCompat.setFlags( MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS ); Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setClass(this, MediaButtonReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0); mMediaSessionCompat.setMediaButtonReceiver(pendingIntent); setSessionToken(mMediaSessionCompat.getSessionToken()); }
Terakhir, kita akan mendaftarkan BroadcastReceiver
yang telah dibuat ke bagian atas kelas sehingga kita bisa mendengarkan aktivitas yang berubah pada headphone.
private void initNoisyReceiver() { //Handles headphones coming unplugged. cannot be done through a manifest receiver IntentFilter filter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); registerReceiver(mNoisyReceiver, filter); }
Menangani Fokus Audio
Sekarang Anda telah selesai menginisialisasi objek BroadcastReceiver
, MediaSessionCompat
dan MediaPlayer
, sekarang waktunya untuk menangani fokus audio.
Meskipun kita mungkin menganggap aplikasi audio kita sendiri yang paling penting saat ini, aplikasi lain di perangkat akan bersaing untuk membuat suara mereka sendiri, seperti notifikasi email atau game seluler. Agar bisa bekerja dengan berbagai situasi ini, sistem Android menggunakan fokus audio untuk menentukan bagaimana audio harus ditangani.
Kasus pertama yang akan kita tangani adalah memulai pemutaran dan mencoba menerima fokus perangkat. Dalam objek MediaSessionCompat.Callback
Anda, pergilah ke metode onPlay()
dan tambahkan dibawah ini kedalamnya.
@Override public void onPlay() { super.onPlay(); if( !successfullyRetrievedAudioFocus() ) { return; } }
Kode diatas akan memanggil metode yang membantu mencoba memanggil kembali fokus, namun jika gagal, kode ini akan mengembalikannya. Dalam aplikasi sebenarnya, Anda pasti ingin menangani pemutaran yang gagal dengan lebih anggun. Menggunakan successfullyRetrievedAudioFocus()
akan memberi referensi pada sistem AudioManager
, dan mencoba meminta fokus audio untuk streaming musik. Nantinya ini akan mengembalikan boolean
yang mewakili sukses tidaknya permintaan.
private boolean successfullyRetrievedAudioFocus() { AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); return result == AudioManager.AUDIOFOCUS_GAIN; }
Anda juga akan menyadari bahwa kita melewati ini
dalam metode requestAudioFocus()
yang menghubungkan OnAudioFocusChangeListener
dengan layanan kita. Terdapat beberapa perbedaan keadaan yang akan Anda ingin dengarkan agar menjadi “penduduk yang baik” dalam ekosistem aplikasi pada perangkat.
-
AudioManager.AUDIOFOCUS_LOSS
: ini terjadi ketika aplikasi yang lain meminta fokus audio. Ketika hal ini terjadi, Anda harus menghentikan pemutaran di aplikasi Anda. -
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
: Tkeadaan ini terjadi ketika aplikasi lain ingin memutar audio namun hanya membutuhkan fokus dalam jangka pendek. Anda bisa menggunakan ini untuk membuat pemutaran audio Anda berhenti sejenak. -
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
: Ketika fokus audio diminta namun tidak menuntut perhatian penuh, aplikasi Anda dapat tetap diputar namun perlu dipelankan. Ini terjadi ketika suara notifikasi dimainkan oleh perangkat.
-
AudioManager.AUDIOFOCUS_GAIN
: Kondisi terakhir yang akan kita bahas adalahAUDIOFOCUS_GAIN
. Ini adalah keadaan dimana audio seperti kondisi pada bahasan sebelumnya telah berakhir, dan aplikasi Anda dapat diputar seperti keadaan dan volume sebelumnya.
Callback onAudioFocusChange()
yang disederhanakan mungkin terlihat seperti:
@Override public void onAudioFocusChange(int focusChange) { switch( focusChange ) { case AudioManager.AUDIOFOCUS_LOSS: { if( mMediaPlayer.isPlaying() ) { mMediaPlayer.stop(); } break; } case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: { mMediaPlayer.pause(); break; } case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: { if( mMediaPlayer != null ) { mMediaPlayer.setVolume(0.3f, 0.3f); } break; } case AudioManager.AUDIOFOCUS_GAIN: { if( mMediaPlayer != null ) { if( !mMediaPlayer.isPlaying() ) { mMediaPlayer.start(); } mMediaPlayer.setVolume(1.0f, 1.0f); } break; } } }
Memahami MediaSessionCompat.Callback
Sekarang Anda telah memiliki struktur umum dari layanan/Service
Anda. Sekarang saatnya untuk masuk lebih dalam ke MediaSessionCompat.Callback
. Pada sesi terakhir Anda telah menambahkan sedikit pada onPlay()
untuk mengecek apakah fokus audio dijamin. Dibawah penyataan prasyarat, Anda akan ingin mengatur objek MediaSessionCompat
untuk diaktifkan, memberi keadaan STATE_PLAYING
, dan menetapkan tindakan yang benar dan dibutuhkan untuk membuat tombol pause pada kontrol layar kunci untuk perangkat sebelum Lollipop, ponsel, dan notifikasi pada Android.
@Override public void onPlay() { super.onPlay(); if( !successfullyRetrievedAudioFocus() ) { return; } mMediaSessionCompat.setActive(true); setMediaPlaybackState(PlaybackStateCompat.STATE_PLAYING); ... }
Metode setMediaPlaybackState()
diatas adalah metode penolong yang membuat objek PlaybackStateCompat.Builder
dan memberinya aksi dan kondisi layak, serta membangun dan menghubungkan PlaybackStateCompat
dengn objek MediaSessionCompat
Anda.
private void setMediaPlaybackState(int state) { PlaybackStateCompat.Builder playbackstateBuilder = new PlaybackStateCompat.Builder(); if( state == PlaybackStateCompat.STATE_PLAYING ) { playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PAUSE); } else { playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PLAY); } playbackstateBuilder.setState(state, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 0); mMediaSessionCompat.setPlaybackState(playbackstateBuilder.build()); }
Penting untuk dicatat bahwa Anda akan membutuhkan ACTION_PLAY_PAUSE
dan salah satu dari ACTION_PAUSE
atau ACTION_PLAY
dalam tindakan Anda untuk mendapat kontrol yang baik dalam penggunaan Android.



Kembali ke onPlay()
, Anda akan ingin menunjukkan notifikasi bahwa aplikasi sedang diputar yang disambungkan dengan objek MediaSessionCompat
dengan menggunakan kelas MediaStyleHelper
yang telah kita definisikan seblumnya, dan menunjukkan notifikasi tersebut.
private void showPlayingNotification() { NotificationCompat.Builder builder = MediaStyleHelper.from(BackgroundAudioService.this, mMediaSessionCompat); if( builder == null ) { return; } builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_pause, "Pause", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_PLAY_PAUSE))); builder.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mMediaSessionCompat.getSessionToken())); builder.setSmallIcon(R.mipmap.ic_launcher); NotificationManagerCompat.from(BackgroundAudioService.this).notify(1, builder.build()); }
Terakhir, Anda akan memulai MediaPlayer
pada bagian akhir onPlay()
.
@Override public void onPlay() { super.onPlay(); ... showPlayingNotification(); mMediaPlayer.start(); }



Ketika callback menerima komando untuk pause, onPause()
akan dipanggil. Disini Anda akan menghentikan sejenak MediaPlayer
, mengatur keadaan ke STATE_PAUSED
, dan menunjukkan notifikasi kondisi sedang pause.
@Override public void onPause() { super.onPause(); if( mMediaPlayer.isPlaying() ) { mMediaPlayer.pause(); setMediaPlaybackState(PlaybackStateCompat.STATE_PAUSED); showPausedNotification(); } }
Metode penolong kita, showPausedNotification()
, akan tampak mirip dengan metode showPlayNotification()
.
private void showPausedNotification() { NotificationCompat.Builder builder = MediaStyleHelper.from(this, mMediaSessionCompat); if( builder == null ) { return; } builder.addAction(new NotificationCompat.Action(android.R.drawable.ic_media_play, "Play", MediaButtonReceiver.buildMediaButtonPendingIntent(this, PlaybackStateCompat.ACTION_PLAY_PAUSE))); builder.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mMediaSessionCompat.getSessionToken())); builder.setSmallIcon(R.mipmap.ic_launcher); NotificationManagerCompat.from(this).notify(1, builder.build()); }
Metode selanjutnya di callback yang akan kita diskusikan, onPlayFromMediaId(),
menjadikan String
dan Bundle
sebagai parameter. Ini adalah metode callback yang bisa Anda gunakan untuk mengubah jejak audio/konten dalam aplikasi Anda.
Dalam tutorial ini, kita akan menerima ID sumber mentah dan mencoba memainkannya, lalu menginisialisasi ulang metadata pada sesi tersebut. Sebagaimana Anda diperbolehkan melewati Bundle
pada metode ini, Anda juga bisa menggunakannya untuk menata aspek lainnya dalam pemutar ulang media Anda, seperti pengaturan suara latar untuk jejak.
@Override public void onPlayFromMediaId(String mediaId, Bundle extras) { super.onPlayFromMediaId(mediaId, extras); try { AssetFileDescriptor afd = getResources().openRawResourceFd(Integer.valueOf(mediaId)); if( afd == null ) { return; } try { mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); } catch( IllegalStateException e ) { mMediaPlayer.release(); initMediaPlayer(); mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); } afd.close(); initMediaSessionMetadata(); } catch (IOException e) { return; } try { mMediaPlayer.prepare(); } catch (IOException e) {} //Work with extras here if you want }
Sekarang setelah kita mendiskusikan dua metode utama pada callback yang dapat Anda gunakan pada aplikasi Anda, adalah penting untuk mengetahui ada metode pilihan lainnya yang bisa Anda gunakan untuk menata layanan Anda. Beberapa metode tersebut termasuk onSeekTo()
, yang mengijinkan Anda mengubah posisi pemutaran konten, dan onCommand()
, yang akan menerima String
yang menunjukkan jenis komando, sebuah Bundle
untuk tambahan informasi mengenasi komendo, dan callback ResultReceiver
, yang memungkinkan Anda mengirimkan komando buatan Anda kedalam Service
.
@Override public void onCommand(String command, Bundle extras, ResultReceiver cb) { super.onCommand(command, extras, cb); if( COMMAND_EXAMPLE.equalsIgnoreCase(command) ) { //Custom command here } } @Override public void onSeekTo(long pos) { super.onSeekTo(pos); }
Mengancurkan/Tearing Down
Ketika file audio kita lengkap, kita akan ingin menentukan apa langkah kita selanjutnya. Ketika Anda mungkin ini memutar track selanjutnya pada aplikasi, kita akan membuatnya menjadi sederhana dengan merilis MediaPlayer
.
@Override public void onCompletion(MediaPlayer mediaPlayer) { if( mMediaPlayer != null ) { mMediaPlayer.release(); } }
Akhirnya kita akan ingin melakukan beberapa hal kecil di metode onDestroy()
pada Service
kita. Pertama, kita akan mendapatkan referensi pada layanan sistem AudioManager
, dan memanggil abandonAudioFocus()
dengan AudioFocusChangeListener
sebagai parameter, yang akan memberitahu aplikasi lainnya pada perangkat bahwa Anda akan menyerahkan fokus audio. Selanjutnya, menghapus register BroadcastReceiver
yang diatur untuk mendengarkan perubahan pada headphone, dan merilis objek MediaSessionCompat
. Terakhirm Ana akan ingin membatalkan notifikasi kontrol pemutaran.
@Override public void onDestroy() { super.onDestroy(); AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.abandonAudioFocus(this); unregisterReceiver(mNoisyReceiver); mMediaSessionCompat.release(); NotificationManagerCompat.from(this).cancel(1); }
Pada titik ini, Anda sebaiknya memiliki Service
menggunakan MediaSessionCompat
untuk kontrol pemutaran diseluruh perangkat. Sementara telah banyak yang terlibat hanya dalam menciptakan layanan, Anda sebaiknya mamu mengontrol pemutaran dari aplikasi Anda, sebuah notifikasi, kontrol kunci layar pada perangkat sebelum Lollipop ( Lollipop akan nmenggunakan notifikasi pada layar kunci), dan dari perangkat periferal seperti Android Wear, begitu Service
dimulai



Memulai dan Mengontrol Konten dari Aktivitas.
Sementara sebagian besar kontrol bersifat otomatis, Anda akan tetap perlu memulai dan mengontrol sesi media dari kontrol dalam aplikasi Anda. Setidaknya Anda akan menginginkan objek MediaBrowserCompat. ConnectionCallback
, MediaControllerCompat. Callback
, MediaBrowserCompat
, dan MediaControllerCompat
tercipta dalam aplikasi Anda.
MediaControllerCompat.Callback
akan memiliki metode bernama onPlaybackStateChanged()
yang menerima perubahan pada kondisi pemutaran yang bida digunakan untuk membuat UI anda tetap singkron.
private MediaControllerCompat.Callback mMediaControllerCompatCallback = new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { super.onPlaybackStateChanged(state); if( state == null ) { return; } switch( state.getState() ) { case PlaybackStateCompat.STATE_PLAYING: { mCurrentState = STATE_PLAYING; break; } case PlaybackStateCompat.STATE_PAUSED: { mCurrentState = STATE_PAUSED; break; } } } };
MediaBrowserCompat.ConnectionCallback
memiliki sebuah metode onConnected()
yang akan dipanggil jika objek MediaBrowserCompat
baru dibuat dan disambungkan. Anda bisa menggunakannya untuk menginisialisasi objek MediaControllerCompat
Anda, menghubungkannya ke MediaControllerCompat.Callback
, dan mengasosiasikannya dengan MediaSessionCompat
dari layanan/Service
Anda. Begitu selesai, Anda bisa memulai pemutaran audio dari metode ini.
private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() { @Override public void onConnected() { super.onConnected(); try { mMediaControllerCompat = new MediaControllerCompat(MainActivity.this, mMediaBrowserCompat.getSessionToken()); mMediaControllerCompat.registerCallback(mMediaControllerCompatCallback); setSupportMediaController(mMediaControllerCompat); getSupportMediaController().getTransportControls().playFromMediaId(String.valueOf(R.raw.warner_tautz_off_broadway), null); } catch( RemoteException e ) { } } };
Anda akan menyadari bahwa potongan kode diatas menggunakan getSupportMediaController().getTransportControls()
untuk berkomunikasi dengan sesi media. Menggunakan teknik yang sama, Anda juga dapat memanggil onPlay()
dan onPause()
dalam objek MediaSessionCompat.Callback
di layanan audio Anda.
if( mCurrentState == STATE_PAUSED ) { getSupportMediaController().getTransportControls().play(); mCurrentState = STATE_PLAYING; } else { if( getSupportMediaController().getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING ) { getSupportMediaController().getTransportControls().pause(); } mCurrentState = STATE_PAUSED; }
Jika Anda telah selesai dengan pemutaran audio, anda dapat menghentikan sejenak layanan audio atau memutus smabungan objek MediaBrowserCompat
Anda, yang akan kita lakukan pada tutorial ini ketika Activity
ini dihancurkan.
@Override protected void onDestroy() { super.onDestroy(); if( getSupportMediaController().getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING ) { getSupportMediaController().getTransportControls().pause(); } mMediaBrowserCompat.disconnect(); }
Pengemasan
Woa! Seperti yang Anda lihat, terdapat banyak potongan-potongan kecil yang terlibat dalam membuat dan menggunakan layanan audio latar dengan benar.
Dalam tutorial ini, Anda telah membuat layanan yang memainkan file audio sederhana, mendengarkan perubahan pada fokus audio, dan menghubungkannya ke MediaSessionCompat
untuk menyediakan kontrol pemutaran universal pada perangkat Android, termasuk handsets dan Android Wear. Jika Anda mengalami hambatan saat bekerja dnegan tutorial ini, Saya sangat menganjurkan Anda untuk mengecek kode proyek Android terasosiasi di Envato Tuts+'s GitHub.
Dan silahkan mengecek beberapa kursus dan tutorial Android kami disini diEnvato Tuts+!
- ANDROID SDKApa yang baru di Android N dan Wear 2.0Paul Trebilcox-Ruiz
- ANDROID SDKLayanan Google Play: Google Cast v3 dan MediaPaul Trebilcox-Ruiz
- ANDROID SDKMengambil Gambar dengan Aplikasi Android AndaAshraff Hathibelagal