Media Session 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) |
回调的示例架构:
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);
}
}