মিডিয়া অ্যাপে প্রায়ই মিডিয়া আইটেমের সংগ্রহ থাকে, যা একটি হায়ারার্কি অনুযায়ী সাজানো হয়। যেমন, কোনও অ্যালবামের গান বা প্লেলিস্টের টিভি এপিসোড। মিডিয়া আইটেমের এই হায়ারার্কিকে মিডিয়া লাইব্রেরি বলা হয়।
MediaLibraryService আপনার মিডিয়া লাইব্রেরি পরিবেশন ও অ্যাক্সেস করার জন্য একটি স্ট্যান্ডার্ড API প্রদান করে।
যেমন, আপনার মিডিয়া অ্যাপে
Android Auto-এর জন্য সহায়তা যোগ করার সময় এটি সহায়ক হতে পারে, যা আপনার
মিডিয়া লাইব্রেরির জন্য নিজস্ব ড্রাইভার-সেফ UI প্রদান করে।
MediaLibraryService তৈরি করা
MediaLibraryService প্রয়োগ করা প্রয়োগ করার
MediaSessionService মতোই, তবে onGetSession() পদ্ধতিতে, আপনাকে MediaSession-এর পরিবর্তে MediaLibrarySession রিটার্ন করতে হবে।
Kotlin
class PlaybackService : MediaLibraryService() { private var mediaLibrarySession: MediaLibrarySession? = null private val callback: MediaLibrarySession.Callback = object : MediaLibrarySession.Callback { /* ... */ } override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? { // 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 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.MediaLibraryService"/>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
</service>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
আপনার পরিষেবা প্ল্যাটফর্ম ও Media3 পরিষেবা ইন্টারফেস, দুটি হিসেবেই রেজিস্টার করার পরামর্শ দেওয়া হয়:
প্ল্যাটফর্ম মিডিয়া সেশন API ব্যবহার করা ক্লায়েন্টের সাথে কম্প্যাটিবিলিটির জন্য,
<action android:name="android.media.browse.MediaBrowserService"/>-কেintent-filterএলিমেন্টে অন্তর্ভুক্ত করার জন্য সাজেস্ট করা হয়। Media3 এই পরিষেবা ইন্টারফেসের সাথে অটোমেটিক ব্যাকওয়ার্ড কম্প্যাটিবিলিটি প্রদান করে।ভবিষ্যতের কথা ভেবে সেট-আপ করা এবং Media3 ব্যবহার করে এমন অ্যাপ যাতে Media3 API ব্যবহার করে আপনার পরিষেবার সাথে যোগাযোগ করতে পারে তা নিশ্চিত করার জন্য, প্ল্যাটফর্ম বিকল্পের পাশাপাশি
<action android:name="androidx.media3.session.MediaLibraryService"/>প্রদান করা উচিত।
এর ফলে, অ্যাপ PackageManager-এর মাধ্যমে আপনার পরিষেবা খুঁজে পেতে এবং এই ইন্টারফেসগুলির
মাধ্যমে MediaBrowser-এর সাথে কানেক্ট করতে পারে।
MediaLibrarySession ব্যবহার করুন
MediaLibraryService API-এর প্রত্যাশা হল আপনার মিডিয়া লাইব্রেরি একটি
ট্রি ফর্ম্যাটে সাজানো থাকবে, যার একটিই রুট নোড ও চাইল্ড নোড থাকবে যা
প্লে করা যায় অথবা আরও ব্রাউজ করা যায়।
MediaLibrarySession MediaSession API-কে এক্সটেন্ড করে কন্টেন্ট
ব্রাউজিং API যোগ করে। MediaSession কলব্যাক-এর তুলনায়, MediaLibrarySession কলব্যাক এই ধরনের পদ্ধতি যোগ করে:
onGetLibraryRoot()যখন কোনও ক্লায়েন্ট কন্টেন্ট ট্রি-এরMediaItemরুট অনুরোধ করেonGetChildren()যখন কোনও ক্লায়েন্ট কন্টেন্ট ট্রি-তেMediaItem-এর চাইল্ডের জন্য অনুরোধ করেonGetSearchResult()যখন কোনও ক্লায়েন্ট নির্দিষ্ট কোয়েরির জন্য কন্টেন্ট ট্রি থেকে সার্চ ফলাফল চায়
প্রাসঙ্গিক কলব্যাক পদ্ধতিতে LibraryParams অবজেক্ট থাকবে যার মধ্যে
ক্লায়েন্ট অ্যাপ যে ধরনের কন্টেন্ট ট্রি দেখতে
আগ্রহী সেই সম্পর্কিত অতিরিক্ত সিগন্যাল থাকবে।
মিডিয়া আইটেমের জন্য কমান্ড বোতাম
সেশন অ্যাপ, MediaItem-এMediaMetadata কাজ করে এমন কমান্ড বোতাম ঘোষণা করতে পারে। এটি কন্ট্রোলারকে কোনও মিডিয়া আইটেমের জন্য এক বা একাধিক CommandButton এন্ট্রি
অ্যাসাইন করতে দেয় যা কন্ট্রোলার দেখাতে এবং আইটেমের জন্য কাস্টম
কমান্ড সেশনে পাঠানোর জন্য সুবিধাজনকভাবে ব্যবহার করতে পারে।
সেশন সাইডে কমান্ড বোতাম সেট-আপ করা
সেশন তৈরি করার সময়, সেশন অ্যাপ কমান্ড বোতামের সেট ঘোষণা করে যা সেশন কাস্টম কমান্ড হিসেবে ম্যানেজ করতে পারে:
Kotlin
val allCommandButtons = listOf( CommandButton.Builder(CommandButton.ICON_PLAYLIST_ADD) .setDisplayName(context.getString(R.string.add_to_playlist)) .setSessionCommand(SessionCommand(COMMAND_PLAYLIST_ADD, Bundle.EMPTY)) .setExtras(playlistAddExtras) .build(), CommandButton.Builder(CommandButton.ICON_RADIO) .setDisplayName(context.getString(R.string.radio_station)) .setSessionCommand(SessionCommand(COMMAND_RADIO, Bundle.EMPTY)) .setExtras(radioExtras) .build(), ) // 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(context.getString(R.string.add_to_playlist)) .setSessionCommand(new SessionCommand(COMMAND_PLAYLIST_ADD, Bundle.EMPTY)) .setExtras(playlistAddExtras) .build(), new CommandButton.Builder(CommandButton.ICON_RADIO) .setDisplayName(context.getString(R.string.radio_station)) .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();
কোনও মিডিয়া আইটেম তৈরি করার সময়, সেশন অ্যাপ, কাজ করে এমন কমান্ড আইডির একটি সেট যোগ করতে পারে যেটি সেশন কমান্ডের কমান্ড বোতামকে রেফার করে যা সেশন তৈরি করার সময় সেট-আপ করা হয়েছে:
Kotlin
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 কলব্যাক পদ্ধতিতে পাস করা হয়েছে, এটি
এই ভ্যালু সহজে অ্যাক্সেস করার জন্য গেটার প্রদান করে। ডিফল্ট হিসেবে ভ্যালু ০ হিসেবে সেট করা থাকে যা
বোঝায় যে ব্রাউজার বা কন্ট্রোলার এই ফিচারে কাজ করে না:
Kotlin
override fun onGetItem( session: MediaLibrarySession, browser: MediaSession.ControllerInfo, mediaId: String, ): ListenableFuture<LibraryResult<MediaItem>> { val settableFuture = SettableFuture.create<LibraryResult<MediaItem>>() val maxCommandsForMediaItems = browser.maxCommandsForMediaItems loadMediaItemAsync(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; }
কোনও মিডিয়া আইটেমের জন্য পাঠানো কাস্টম অ্যাকশন হ্যান্ডেল করার সময়, সেশন
অ্যাপ আর্গুমেন্ট Bundle থেকে মিডিয়া আইটেম আইডি পেতে পারে যা
onCustomCommand-এ পাস করা হয়েছে:
Kotlin
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:
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).setMaxCommandsForMediaItems(3).buildAsync()
জাভা
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).setMaxCommandsForMediaItems(3).buildAsync();
সেশনের সাথে কানেক্ট করা থাকলে, কন্ট্রোলার অ্যাপ সেইসব কমান্ড বোতাম পেতে পারে যেগুলি মিডিয়া আইটেমে কাজ করে এবং যেগুলির জন্য কন্ট্রোলারের কাছে সেশন অ্যাপের দেওয়া উপলভ্য কমান্ড আছে:
Kotlin
val commandButtonsForMediaItem = controller.getCommandButtonsForMediaItem(mediaItem)
জাভা
ImmutableList<CommandButton> commandButtonsForMediaItem = controller.getCommandButtonsForMediaItem(mediaItem);
Kotlin
val future = controller.sendCustomCommand( requireNotNull(addToPlaylistButton.sessionCommand), mediaItem, Bundle.EMPTY, )
জাভা
ListenableFuture<SessionResult> future = controller.sendCustomCommand( checkNotNull(addToPlaylistButton.sessionCommand), mediaItem, Bundle.EMPTY);