किसी मीडिया ऐप्लिकेशन के प्लेबैक से क्वेरी करने और उसे कंट्रोल करने के लिए, मीडिया कंट्रोलर मीडिया सेशन से इंटरैक्ट करता है. Media3 में, MediaController
एपीआई, Player
इंटरफ़ेस को लागू करता है. मीडिया कंट्रोलर का इस्तेमाल करने वाले क्लाइंट ऐप्लिकेशन के
उदाहरणों में ये शामिल हैं:
- Android सिस्टम के मीडिया कंट्रोल
- Android Wear OS का साथी ऐप्लिकेशन
- Android Auto और Automotive OS
- Google Assistant जैसी वॉइस असिस्टेंट
- Media Controller Test ऐप्लिकेशन
मीडिया कंट्रोलर, मीडिया ऐप्लिकेशन में भी काम का हो सकता है. उदाहरण के लिए, जब प्लेयर और मीडिया सेशन, यूज़र इंटरफ़ेस (यूआई) वाले Service
या Activity
से अलग Fragment
में रहते हों.
MediaController
बनाएं
MediaController
बनाने के लिए, उससे जुड़े MediaSession
के लिए SessionToken
बनाएं. इसके लिए, Activity
या Fragment
में से onStart()
तरीका आपके लिए अच्छा हो सकता है.
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
इस SessionToken
का इस्तेमाल करके, MediaController
बनाने पर, कंट्रोलर को दिए गए सेशन से कनेक्ट किया जाता है. यह एसिंक्रोनस रूप से होता है, इसलिए आपको
नतीजे को सुनना चाहिए और उपलब्ध होने पर उसका इस्तेमाल करना चाहिए.
Kotlin
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(context, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor());
MediaController
का इस्तेमाल करना
MediaController
, Player
इंटरफ़ेस को लागू करता है, ताकि कनेक्ट किए गए MediaSession
के प्लेबैक को कंट्रोल करने के लिए, इंटरफ़ेस में दिए गए निर्देशों का इस्तेमाल किया जा सके.
इसका मतलब है कि MediaController
पर play()
को कॉल करने से, MediaSession
को निर्देश भेजा जाएगा. इसके बाद, MediaSession
अपने Player
को निर्देश देगा.
इसी तरह, Player
स्टेटस में होने वाले बदलावों को सुनने के लिए, कंट्रोलर में Player.Listener
जोड़ा जा सकता है. Player.Listener
का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, प्लेयर इवेंट गाइड देखें. MediaController.Listener
इंटरफ़ेस, कनेक्ट किए गए MediaSession
से इवेंट और इनकमिंग कमांड के लिए, अतिरिक्त कॉलबैक के बारे में जानकारी देता है. जैसे, onAvailableSessionCommandsChanged()
से, जब मीडिया सेशन उपलब्ध सेशन कमांड में बदलाव करता है और कंट्रोलर को सेशन से डिसकनेक्ट किए जाने पर onDisconnected()
करता है.
अन्य कॉम्पोनेंट की तरह ही, जब MediaController
की ज़रूरत न हो, तो उसे रिलीज़ करना न भूलें. जैसे, Activity
या Fragment
के onStop()
तरीके में.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
कंट्रोलर को रिलीज़ करने पर भी, सेशन में भेजे गए सभी निर्देश डिलीवर किए जाएंगे. साथ ही, सेशन सेवा से सिर्फ़ तब अनबाइंड किया जाएगा, जब इन निर्देशों को मैनेज कर लिया जाएगा या टाइम आउट की अवधि खत्म हो जाएगी. इनमें से जो भी पहले होगा.
MediaBrowser
बनाना और उसका इस्तेमाल करना
MediaBrowser
, MediaController
की सुविधाओं के साथ काम करता है. इससे मीडिया ऐप्लिकेशन के MediaLibraryService
की लाइब्रेरी को ब्राउज़ करने की सुविधा भी मिलती है.
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
मीडिया ऐप्लिकेशन की कॉन्टेंट लाइब्रेरी को ब्राउज़ करने के लिए, पहले getLibraryRoot()
की मदद से रूट नोड को वापस पाएं:
Kotlin
// Get the library root to start browsing the library tree. val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null) rootFuture.addListener({ // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor())
Java
// Get the library root to start browsing the library tree. ListenableFuture<LibraryResult<MediaItem>> rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null); rootFuture.addListener(() -> { // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor());
इसके बाद, getChildren()
का इस्तेमाल करके लाइब्रेरी में MediaItem
के बच्चों को ढूंढकर, मीडिया लाइब्रेरी में नेविगेट किया जा सकता है. उदाहरण के लिए, रूट नोड MediaItem
के चाइल्ड को वापस पाने के लिए:
Kotlin
// Get the library root to start browsing the library tree. val childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null) childrenFuture.addListener({ // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor())
Java
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null); childrenFuture.addListener(() -> { // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor());