媒体会话回调调用不同的接口方法来控制播放器,管理音频焦点,并实现媒体会话和媒体浏览器服务间的通信。下面的列表总结这些任务如何分布在回调中。
_ | 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 = newMediaSessionCompat.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); }}新闻热点
疑难解答