Your media session callbacks call methods in several APIs to control the player, manage the audio focus, and communicate with the media session and media browser service. The following table summarizes how these tasks are distributed across callbacks.
| onPlay() | onPause() | onStop() | |
| Audio Focus | requestFocus() passing in your OnAudioFocusChangeListener.Always call requestFocus() first, proceed only if focus is granted.
|
abandonAudioFocus()
|
|
| Service | startService()
|
stopSelf()
|
|
| Media Session | setActive(true)
- Update metadata and state |
- Update metadata and state | setActive(false)
- Update metadata and state |
| Player Implementation | Start the player | Pause the player | Stop the player |
| Becoming Noisy | Register your BroadcastReceiver
|
Unregister your BroadcastReceiver
|
|
| Notifications | startForeground(notification)
|
stopForeground(false)
|
stopForeground(true)
|
Here is a sample framework for the callback:
private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
// Defined elsewhere...
private AudioManager.OnAudioFocusChangeListener afChangeListener;
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();
private MediaStyleNotification myPlayerNotification;
private MediaSessionCompat mediaSession;
private MediaBrowserService service;
private SomeKindOfPlayer player;
MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
@Override
public void onPlay() {
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback, this registers the afChangeListener
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// Start the service
service.start();
// Set the session active (and update metadata and state)
mediaSession.setActive(true);
// start the player (custom call)
player.start();
// Register BECOME_NOISY BroadcastReceiver
registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
// Put the service in the foreground, post notification
service.startForeground(myPlayerNotification);
}
}
@Override
public void onStop() {
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Abandon audio focus
am.abandonAudioFocus(afChangeListener);
unregisterReceiver(myNoisyAudioStreamReceiver);
// Start the service
service.stop(self);
// Set the session inactive (and update metadata and state)
mediaSession.setActive(false);
// stop the player (custom call)
player.stop();
// Take the service out of the foreground, remove notification
service.stopForeground(true);
}
@Override
public void onPause() {
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Update metadata and state
// pause the player (custom call)
player.pause();
// unregister BECOME_NOISY BroadcastReceiver
unregisterReceiver(myNoisyAudioStreamReceiver, intentFilter);
// Take the service out of the foreground, retain the notification
service.stopForeground(false);
}
}