Các phương thức gọi lệnh gọi lại phiên phát nội dung đa phương tiện trong một số API để điều khiển trình phát, quản lý quyền phát âm thanh,
và giao tiếp với phiên phát nội dung đa phương tiện và dịch vụ trình duyệt nội dung đa phương tiện. Lưu ý rằng
Logic MediaSession
phản hồi các lệnh gọi lại phải nhất quán. Hành vi
của lệnh gọi lại không được phụ thuộc vào danh tính của phương thức gọi (có thể là
một hoạt động trong cùng một ứng dụng chạy MediaSession
hoặc bất kỳ ứng dụng nào khác có
Đã kết nối MediaController
với MediaSession
.
Bảng sau đây tóm tắt cách phân phối các tác vụ này qua các lệnh gọi lại.
onPlay() | onPause() | onStop() | |
Tập trung âm thanh | requestFocus() đang truyền vào OnAudioFocusChangeListener của bạn.Luôn gọi requestFocus() trước, chỉ tiếp tục nếu tiêu điểm được cấp.
|
abandonAudioFocus()
|
|
Dịch vụ | startService()
|
stopSelf()
|
|
Phiên nội dung đa phương tiện | setActive(true)
– Cập nhật siêu dữ liệu và trạng thái |
– Cập nhật siêu dữ liệu và trạng thái | setActive(false)
– Cập nhật siêu dữ liệu và trạng thái |
Triển khai trình phát | Khởi động trình phát | Tạm dừng trình phát | Dừng trình phát |
Trở nên ồn ào | Đăng ký BroadcastReceiver của bạn
|
Huỷ đăng ký BroadcastReceiver
|
|
Thông báo | startForeground(notification)
|
stopForeground(false)
|
stopForeground(false)
|
Dưới đây là một khung mẫu cho lệnh gọi lại:
Kotlin
private val intentFilter = IntentFilter(ACTION_AUDIO_BECOMING_NOISY) // Defined elsewhere... private lateinit var afChangeListener: AudioManager.OnAudioFocusChangeListener private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver() private lateinit var myPlayerNotification: MediaStyleNotification private lateinit var mediaSession: MediaSessionCompat private lateinit var service: MediaBrowserService private lateinit var player: SomeKindOfPlayer private lateinit var audioFocusRequest: AudioFocusRequest private val callback = object: MediaSessionCompat.Callback() { override fun onPlay() { val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager // Request audio focus for playback, this registers the afChangeListener audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run { setOnAudioFocusChangeListener(afChangeListener) setAudioAttributes(AudioAttributes.Builder().run { setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) build() }) build() } val result = am.requestAudioFocus(audioFocusRequest) if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // Start the service startService(Intent(context, MediaBrowserService::class.java)) // Set the session active (and update metadata and state) mediaSession.isActive = 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(id, myPlayerNotification) } } public override fun onStop() { val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager // Abandon audio focus am.abandonAudioFocusRequest(audioFocusRequest) unregisterReceiver(myNoisyAudioStreamReceiver) // Stop the service service.stopSelf() // Set the session inactive (and update metadata and state) mediaSession.isActive = false // stop the player (custom call) player.stop() // Take the service out of the foreground service.stopForeground(false) } public override fun onPause() { val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager // Update metadata and state // pause the player (custom call) player.pause() // unregister BECOME_NOISY BroadcastReceiver unregisterReceiver(myNoisyAudioStreamReceiver) // Take the service out of the foreground, retain the notification service.stopForeground(false) } }
Java
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; private AudioFocusRequest audioFocusRequest; MediaSessionCompat.Callback callback = new MediaSessionCompat.Callback() { @Override public void onPlay() { AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // Request audio focus for playback, this registers the afChangeListener AudioAttributes attrs = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build(); audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) .setOnAudioFocusChangeListener(afChangeListener) .setAudioAttributes(attrs) .build(); int result = am.requestAudioFocus(audioFocusRequest); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // Start the service startService(new Intent(context, MediaBrowserService.class)); // 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(id, myPlayerNotification); } } @Override public void onStop() { AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // Abandon audio focus am.abandonAudioFocusRequest(audioFocusRequest); unregisterReceiver(myNoisyAudioStreamReceiver); // Stop the service service.stopSelf(); // 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 service.stopForeground(false); } @Override public void onPause() { AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // Update metadata and state // pause the player (custom call) player.pause(); // unregister BECOME_NOISY BroadcastReceiver unregisterReceiver(myNoisyAudioStreamReceiver); // Take the service out of the foreground, retain the notification service.stopForeground(false); } };