किसी मीडिया ऐप्लिकेशन से कनेक्ट करना

किसी मीडिया ऐप्लिकेशन के प्लेबैक से क्वेरी करने और उसे कंट्रोल करने के लिए, मीडिया कंट्रोलर मीडिया सेशन से इंटरैक्ट करता है. Media3 में, MediaController एपीआई, Player इंटरफ़ेस को लागू करता है. मीडिया कंट्रोलर का इस्तेमाल करने वाले क्लाइंट ऐप्लिकेशन के उदाहरणों में ये शामिल हैं:

मीडिया कंट्रोलर, मीडिया ऐप्लिकेशन में भी काम का हो सकता है. उदाहरण के लिए, जब प्लेयर और मीडिया सेशन, यूज़र इंटरफ़ेस (यूआई) वाले 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());