زمانی که برنامه شما برای پخش رسانه آماده می شود، MediaSession
ایجاد کنید. قطعه کد زیر نمونه ای از نحوه تنظیم تماس و پرچم مناسب است:
کاتلین
session = MediaSession(this, "MusicService").apply { setCallback(MediaSessionCallback()) setFlags( MediaSession.FLAG_HANDLES_MEDIA_BUTTONS or MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS ) }
جاوا
session = new MediaSession(this, "MusicService"); session.setCallback(new MediaSessionCallback()); session.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
یک جلسه رسانه ای را شروع کنید
هنگام شروع پخش، حتماً setActive(true)
نیز فراخوانی کنید. همانطور که در مدیریت فوکوس صوتی توضیح داده شده است، برنامه شما باید فوکوس صوتی را نیز درخواست کند. این مراحل در مثال زیر نشان داده شده است:
کاتلین
private fun handlePlayRequest() { tryToGetAudioFocus() if (!session.isActive) { session.isActive = true } ... }
جاوا
private void handlePlayRequest() { tryToGetAudioFocus(); if (!session.isActive()) { session.setActive(true); } ... }
وضعیت پخش را به روز کنید
وضعیت پخش را در MediaSession
به روز کنید تا وضعیت رسانه فعلی را منعکس کند:
کاتلین
private fun updatePlaybackState() { val position: Long = mediaPlayer ?.takeIf { it.isPlaying } ?.currentPosition?.toLong() ?: PlaybackState.PLAYBACK_POSITION_UNKNOWN val stateBuilder = PlaybackState.Builder() .setActions(getAvailableActions()).apply { setState(mState, position, 1.0f) } session.setPlaybackState(stateBuilder.build()) } private fun getAvailableActions(): Long { var actions = (PlaybackState.ACTION_PLAY_PAUSE or PlaybackState.ACTION_PLAY_FROM_MEDIA_ID or PlaybackState.ACTION_PLAY_FROM_SEARCH) playingQueue?.takeIf { it.isNotEmpty() }?.apply { actions = if (mState == PlaybackState.STATE_PLAYING) { actions or PlaybackState.ACTION_PAUSE } else { actions or PlaybackState.ACTION_PLAY } if (currentIndexOnQueue > 0) { actions = actions or PlaybackState.ACTION_SKIP_TO_PREVIOUS } if (currentIndexOnQueue < size - 1) { actions = actions or PlaybackState.ACTION_SKIP_TO_NEXT } } return actions }
جاوا
private void updatePlaybackState() { long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN; if (mediaPlayer != null && mediaPlayer.isPlaying()) { position = mediaPlayer.getCurrentPosition(); } PlaybackState.Builder stateBuilder = new PlaybackState.Builder() .setActions(getAvailableActions()); stateBuilder.setState(mState, position, 1.0f); session.setPlaybackState(stateBuilder.build()); } private long getAvailableActions() { long actions = PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PLAY_FROM_SEARCH; if (playingQueue == null || playingQueue.isEmpty()) { return actions; } if (mState == PlaybackState.STATE_PLAYING) { actions |= PlaybackState.ACTION_PAUSE; } else { actions |= PlaybackState.ACTION_PLAY; } if (currentIndexOnQueue > 0) { actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS; } if (currentIndexOnQueue < playingQueue.size() - 1) { actions |= PlaybackState.ACTION_SKIP_TO_NEXT; } return actions; }
فراداده رسانه را به روز کنید
MediaMetadata
با متد setMetadata()
تنظیم کنید. این متد فقط یک بار برای هر شی که پخش می شود فراخوانی می شود. این به شما امکان میدهد اطلاعاتی را در مورد رسانه به جلسه رسانه ارائه دهید، از جمله عنوان، عنوان فرعی، هنرمند، اثر هنری و غیره. مثال زیر برای موسیقی تنظیم شده است و فرض میکند که دادههای آهنگ در یک کلاس داده سفارشی، MediaData
ذخیره میشود:
کاتلین
private fun updateMetadata(myData: MediaData) { val metadataBuilder = MediaMetadata.Builder().apply { // To provide most control over how an item is displayed set the // display fields in the metadata putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, myData.displayTitle) putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, myData.displaySubtitle) putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI, myData.artUri) // And at minimum the title and artist for legacy support putString(MediaMetadata.METADATA_KEY_TITLE, myData.title) putString(MediaMetadata.METADATA_KEY_ARTIST, myData.artist) // A small bitmap for the artwork is also recommended putBitmap(MediaMetadata.METADATA_KEY_ART, myData.artBitmap) // Add any other fields you have for your data as well } session.setMetadata(metadataBuilder.build()) }
جاوا
private void updateMetadata(MediaData myData) { MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder(); // To provide most control over how an item is displayed set the // display fields in the metadata metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, myData.displayTitle); metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, myData.displaySubtitle); metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI, myData.artUri); // And at minimum the title and artist for legacy support metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, myData.title); metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, myData.artist); // A small bitmap for the artwork is also recommended metadataBuilder.putBitmap(MediaMetadata.METADATA_KEY_ART, myData.artBitmap); // Add any other fields you have for your data as well session.setMetadata(metadataBuilder.build()); }