فراخوانیهای برگشتی جلسه رسانه شما روشهایی را در چندین میانای برنامهسازی کاربردی فراخوانی میکنند تا پخشکننده را کنترل کنند، تمرکز صوتی را مدیریت کنند،
و با جلسه رسانه و سرویس مرورگر رسانه ارتباط برقرار کنند. توجه داشته باشید که
MediaSession منطقی که به فراخوانیهای برگشتی پاسخ میدهد باید سازگار باشد. رفتار
فراخوانی برگشتی نباید به هویت فراخواننده بستگی داشته باشد، که میتواند
فعالیتی در همان برنامه باشد که MediaSession را اجرا میکند یا هر برنامه دیگری با
MediaController متصل به MediaSession.
جدول زیر نحوه توزیع این تکالیف را در تماسهای برگشتی خلاصه میکند.
| onPlay() | onPause() | onStop() | |
| اولویت صوتی | requestFocus() در OnAudioFocusChangeListener شما ارسال میشود.همیشه ابتدا requestFocus() را فراخوانی کنید، فقط درصورتی ادامه دهید که تمرکز اعطا شده باشد.
|
abandonAudioFocus()
|
|
| سرویس | startService()
|
stopSelf()
|
|
| جلسه رسانه | setActive(true)
- بهروزرسانی فراداده و وضعیت |
- بهروزرسانی فراداده و وضعیت | setActive(false)
- بهروزرسانی فراداده و وضعیت |
| پیادهسازی پخشکننده | راهاندازی پخشکننده | توقف موقت پخشکننده | توقف پخشکننده |
| پر سروصدا شدن | BroadcastReceiver خود را ثبت کنید
|
لغو ثبتنام BroadcastReceiver
|
|
| اعلانها | startForeground(notification)
|
stopForeground(false)
|
stopForeground(false)
|
در اینجا چارچوب نمونهای برای فراخوانی برگشتی آورده شده است:
کاتلین
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) } }
جاوا
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); } };