মিডিয়া অ্যাপ্লিকেশানগুলিতে প্রায়ই মিডিয়া আইটেমগুলির সংগ্রহ থাকে, একটি শ্রেণিবিন্যাসে সংগঠিত৷ উদাহরণস্বরূপ, একটি অ্যালবামের গান বা প্লেলিস্টে টিভি পর্ব। মিডিয়া আইটেমগুলির এই শ্রেণিবিন্যাস একটি মিডিয়া লাইব্রেরি হিসাবে পরিচিত।
একটি MediaLibraryService
আপনার মিডিয়া লাইব্রেরি পরিবেশন এবং অ্যাক্সেস করার জন্য একটি প্রমিত API প্রদান করে। এটি সহায়ক হতে পারে, উদাহরণস্বরূপ, আপনার মিডিয়া অ্যাপে Android Auto-এর জন্য সমর্থন যোগ করার সময়, যা আপনার মিডিয়া লাইব্রেরির জন্য নিজস্ব ড্রাইভার-নিরাপদ UI প্রদান করে।
একটি MediaLibraryService
তৈরি করুন
একটি MediaLibraryService
বাস্তবায়ন করা একটি MediaSessionService
বাস্তবায়নের অনুরূপ, onGetSession()
পদ্ধতিতে, আপনি একটি MediaSession
এর পরিবর্তে একটি MediaLibrarySession
ফেরত দেবেন।
কোটলিন
class PlaybackService : MediaLibraryService() { var mediaLibrarySession: MediaLibrarySession? = null var callback: MediaLibrarySession.Callback = object : MediaLibrarySession.Callback {...} // If desired, validate the controller before returning the media library session override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? = mediaLibrarySession // Create your player and media library session in the onCreate lifecycle event override fun onCreate() { super.onCreate() val player = ExoPlayer.Builder(this).build() mediaLibrarySession = MediaLibrarySession.Builder(this, player, callback).build() } // Remember to release the player and media library session in onDestroy override fun onDestroy() { mediaLibrarySession?.run { player.release() release() mediaLibrarySession = null } super.onDestroy() } }
জাভা
class PlaybackService extends MediaLibraryService { MediaLibrarySession mediaLibrarySession = null; MediaLibrarySession.Callback callback = new MediaLibrarySession.Callback() {...}; @Override public MediaLibrarySession onGetSession(MediaSession.ControllerInfo controllerInfo) { // If desired, validate the controller before returning the media library session return mediaLibrarySession; } // Create your player and media library session in the onCreate lifecycle event @Override public void onCreate() { super.onCreate(); ExoPlayer player = new ExoPlayer.Builder(this).build(); mediaLibrarySession = new MediaLibrarySession.Builder(this, player, callback).build(); } // Remember to release the player and media library session in onDestroy @Override public void onDestroy() { if (mediaLibrarySession != null) { mediaLibrarySession.getPlayer().release(); mediaLibrarySession.release(); mediaLibrarySession = null; } super.onDestroy(); } }
ম্যানিফেস্ট ফাইলে আপনার Service
এবং প্রয়োজনীয় অনুমতিগুলিও ঘোষণা করতে মনে রাখবেন:
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- For targetSdk 34+ -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
একটি MediaLibrarySession
ব্যবহার করুন
MediaLibraryService
API আশা করে যে আপনার মিডিয়া লাইব্রেরিটি একটি ট্রি ফরম্যাটে গঠন করা হবে, একটি একক রুট নোড এবং চিলড্রেন নোড সহ যা প্লে করা যায় বা আরও ব্রাউজ করা যায় ।
একটি MediaLibrarySession
কন্টেন্ট ব্রাউজিং API যোগ করতে MediaSession
API-কে প্রসারিত করে। MediaSession
কলব্যাকের তুলনায়, MediaLibrarySession
কলব্যাক পদ্ধতি যোগ করে যেমন:
-
onGetLibraryRoot()
যখন কোনো ক্লায়েন্ট কোনো কন্টেন্ট ট্রির রুটMediaItem
অনুরোধ করে -
onGetChildren()
যখন কোনো ক্লায়েন্ট কন্টেন্ট ট্রিতে একটিMediaItem
এর বাচ্চাদের অনুরোধ করে -
onGetSearchResult()
যখন একটি ক্লায়েন্ট একটি প্রদত্ত প্রশ্নের জন্য বিষয়বস্তু গাছ থেকে অনুসন্ধান ফলাফলের অনুরোধ করে
প্রাসঙ্গিক কলব্যাক পদ্ধতিতে একটি LibraryParams
অবজেক্ট অন্তর্ভুক্ত থাকবে যাতে একটি ক্লায়েন্ট অ্যাপ আগ্রহী এমন বিষয়বস্তু গাছের ধরন সম্পর্কে অতিরিক্ত সংকেত দেয়।
মিডিয়া আইটেমগুলির জন্য কমান্ড বোতাম
একটি সেশন অ্যাপ কমান্ড বোতাম ঘোষণা করতে পারে যা MediaMetadata
এ MediaItem
দ্বারা সমর্থিত। এটি একটি মিডিয়া আইটেমে এক বা একাধিক CommandButton
এন্ট্রি বরাদ্দ করার অনুমতি দেয় যা একটি নিয়ামক প্রদর্শন করতে পারে এবং একটি সুবিধাজনক উপায়ে সেশনে আইটেমের জন্য কাস্টম কমান্ড পাঠানোর জন্য ব্যবহার করতে পারে।
সেশন সাইডে কমান্ড বোতাম সেটআপ করুন
সেশন তৈরি করার সময়, একটি সেশন অ্যাপ কমান্ড বোতামগুলির সেট ঘোষণা করে যা একটি সেশন কাস্টম কমান্ড হিসাবে পরিচালনা করতে পারে:
কোটলিন
val allCommandButtons = listOf( CommandButton.Builder(CommandButton.ICON_PLAYLIST_ADD) .setDisplayName(context.getString(R.string.add_to_playlist)) .setDisplayName("Add to playlist") .setIconResId(R.drawable.playlist_add) .setSessionCommand(SessionCommand(COMMAND_PLAYLIST_ADD, Bundle.EMPTY)) .setExtras(playlistAddExtras) .build(), CommandButton.Builder(CommandButton.ICON_RADIO) .setDisplayName(context.getString(R.string.radio_station)) .setIconResId(R.drawable.radio) .setSessionCommand(SessionCommand(COMMAND_RADIO, Bundle.EMPTY)) .setExtras(radioExtras) .build(), // possibly more here ) // Add all command buttons for media items supported by the session. val session = MediaSession.Builder(context, player) .setCommandButtonsForMediaItems(allCommandButtons) .build()
জাভা
ImmutableList<CommandButton> allCommandButtons = ImmutableList.of( new CommandButton.Builder(CommandButton.ICON_PLAYLIST_ADD) .setDisplayName("Add to playlist") .setIconUri(Uri.parse("http://www.example.com/icon/playlist_add")) .setSessionCommand(new SessionCommand(COMMAND_PLAYLIST_ADD, Bundle.EMPTY)) .setExtras(playlistAddExtras) .build(), new CommandButton.Builder(CommandButton.ICON_RADIO) .setDisplayName("Radio station") .setIconUri(Uri.parse("http://www.example.com/icon/radio")) .setSessionCommand(new SessionCommand(COMMAND_RADIO, Bundle.EMPTY)) .setExtras(radioExtras) .build()); // Add all command buttons for media items supported by the session. MediaSession session = new MediaSession.Builder(context, player) .setCommandButtonsForMediaItems(allCommandButtons) .build();
একটি মিডিয়া আইটেম তৈরি করার সময়, একটি সেশন অ্যাপ সমর্থিত কমান্ড আইডিগুলির একটি সেট যোগ করতে পারে যা সেশন তৈরি করার সময় সেটআপ করা কমান্ড বোতামগুলির সেশন কমান্ডের উল্লেখ করে:
কোটলিন
val mediaItem = MediaItem.Builder() .setMediaMetadata( MediaMetadata.Builder() .setSupportedCommands(listOf(COMMAND_PLAYLIST_ADD, COMMAND_RADIO)) .build()) .build()
জাভা
MediaItem mediaItem = new MediaItem.Builder() .setMediaMetadata( new MediaMetadata.Builder() .setSupportedCommands(ImmutableList.of(COMMAND_PLAYLIST_ADD, COMMAND_RADIO)) .build()) .build();
যখন একটি নিয়ামক বা ব্রাউজার সেশন Callback
অন্য একটি পদ্ধতি সংযোগ করে বা কল করে, তখন একটি কন্ট্রোলার বা ব্রাউজার প্রদর্শন করতে পারে এমন সর্বাধিক সংখ্যক কমান্ড বোতাম পেতে সেশন অ্যাপ কলব্যাকে পাস করা ControllerInfo
পরিদর্শন করতে পারে। একটি কলব্যাক পদ্ধতিতে পাস করা ControllerInfo
সুবিধাজনকভাবে এই মান অ্যাক্সেস করার জন্য একটি গেটার প্রদান করে। ডিফল্টরূপে মানটি 0 এ সেট করা থাকে যা নির্দেশ করে যে ব্রাউজার বা কন্ট্রোলার এই বৈশিষ্ট্যটিকে সমর্থন করে না:
কোটলিন
override fun onGetItem( session: MediaLibrarySession, browser: MediaSession.ControllerInfo, mediaId: String, ): ListenableFuture<LibraryResult<MediaItem>> { val settableFuture = SettableFuture.create<LibraryResult<MediaItem>>() val maxCommandsForMediaItems = browser.maxCommandsForMediaItems scope.launch { loadMediaItem(settableFuture, mediaId, maxCommandsForMediaItems) } return settableFuture }
জাভা
@Override public ListenableFuture<LibraryResult<MediaItem>> onGetItem( MediaLibraryService.MediaLibrarySession session, ControllerInfo browser, String mediaId) { SettableFuture<LibraryResult<MediaItem>> settableFuture = SettableFuture.create(); int maxCommandsForMediaItems = browser.getMaxCommandsForMediaItems(); loadMediaItemAsync(settableFuture, mediaId, maxCommandsForMediaItems); return settableFuture; }
একটি মিডিয়া আইটেমের জন্য পাঠানো একটি কাস্টম অ্যাকশন পরিচালনা করার সময়, সেশন অ্যাপ onCustomCommand
এ পাস করা আর্গুমেন্ট Bundle
থেকে মিডিয়া আইটেম আইডি পেতে পারে:
কোটলিন
override fun onCustomCommand( session: MediaSession, controller: MediaSession.ControllerInfo, customCommand: SessionCommand, args: Bundle, ): ListenableFuture<SessionResult> { val mediaItemId = args.getString(MediaConstants.EXTRA_KEY_MEDIA_ID) return if (mediaItemId != null) handleCustomCommandForMediaItem(controller, customCommand, mediaItemId, args) else handleCustomCommand(controller, customCommand, args) }
জাভা
@Override public ListenableFuture<SessionResult> onCustomCommand( MediaSession session, ControllerInfo controller, SessionCommand customCommand, Bundle args) { String mediaItemId = args.getString(MediaConstants.EXTRA_KEY_MEDIA_ID); return mediaItemId != null ? handleCustomCommandForMediaItem(controller, customCommand, mediaItemId, args) : handleCustomCommand(controller, customCommand, args); }
ব্রাউজার বা নিয়ামক হিসাবে কমান্ড বোতাম ব্যবহার করুন
MediaController
দিকে, একটি অ্যাপ MediaController
বা MediaBrowser
তৈরি করার সময় একটি মিডিয়া আইটেমের জন্য সমর্থন করে এমন সর্বাধিক সংখ্যক কমান্ড বোতাম ঘোষণা করতে পারে:
কোটলিন
val browserFuture = MediaBrowser.Builder(context, sessionToken) .setMaxCommandsForMediaItems(3) .buildAsync()
জাভা
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken) .setMaxCommandsForMediaItems(3) .buildAsync();
সেশনের সাথে সংযুক্ত হলে, কন্ট্রোলার অ্যাপ মিডিয়া আইটেম দ্বারা সমর্থিত কমান্ড বোতামগুলি গ্রহণ করতে পারে এবং যার জন্য নিয়ামকের কাছে সেশন অ্যাপ দ্বারা প্রদত্ত উপলব্ধ কমান্ড রয়েছে:
কোটলিন
val commandButtonsForMediaItem: List<CommandButton> = controller.getCommandButtonsForMediaItem(mediaItem)
জাভা
ImmutableList<CommandButton> commandButtonsForMediaItem = controller.getCommandButtonsForMediaItem(mediaItem);
সুবিধার জন্য MediaController
মিডিয়া আইটেম নির্দিষ্ট কাস্টম কমান্ড পাঠাতে পারে MediaController.sendCustomCommand(SessionCommand, MediaItem, Bundle)
:
কোটলিন
controller.sendCustomCommand(addToPlaylistButton.sessionCommand!!, mediaItem, Bundle.EMPTY)
জাভা
controller.sendCustomCommand( checkNotNull(addToPlaylistButton.sessionCommand), mediaItem, Bundle.EMPTY);