मीडिया ऐप्लिकेशन से कनेक्ट करने के दो तरीके हैं:
MediaController
MediaBrowser
MediaController
मीडिया कंट्रोलर, मीडिया सेशन के साथ इंटरैक्ट करता है, ताकि मीडिया ऐप्लिकेशन के प्लेबैक को कंट्रोल किया जा सके और उससे जुड़ी क्वेरी की जा सके. Media3 में, MediaController
एपीआई, Player
इंटरफ़ेस लागू करता है. मीडिया कंट्रोलर का इस्तेमाल करने वाले क्लाइंट ऐप्लिकेशन के उदाहरणों में ये शामिल हैं:
- Android सिस्टम मीडिया कंट्रोल
- Android Wear OS के साथ काम करने वाला ऐप्लिकेशन
- Android Auto और Automotive OS
- वॉइस असिस्टेंट, जैसे कि Google Assistant
- Media Controller Test ऐप्लिकेशन
मीडिया कंट्रोलर, मीडिया ऐप्लिकेशन में भी काम आ सकता है. उदाहरण के लिए, अगर प्लेयर और मीडिया सेशन, यूज़र इंटरफ़ेस (यूआई) के साथ Activity
या Fragment
से अलग Service
में मौजूद हों.
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
से इवेंट और कस्टम कमांड के लिए अतिरिक्त कॉलबैक तय करता है. उदाहरण के लिए, onCustomCommand()
जब सेशन कोई कस्टम कमांड भेजता है, onAvailableSessionCommandsChanged()
जब सेशन, सेशन के लिए उपलब्ध कमांड बदलता है या onDisconnected()
जब कंट्रोलर, सेशन से डिसकनेक्ट हो जाता है.
Builder
की मदद से कंट्रोलर बनाते समय, MediaController.Listener
को सेट किया जा सकता है:
Kotlin
MediaController.Builder(context, sessionToken)
.setListener(
object : MediaController.Listener {
override fun onCustomCommand(
controller: MediaController,
command: SessionCommand,
args: Bundle,
): ListenableFuture<SessionResult> {
// Handle custom command.
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
}
override fun onDisconnected(controller: MediaController) {
// Handle disconnection.
}
}
)
.buildAsync()
Java
new MediaController.Builder(context, sessionToken)
.setListener(
new MediaController.Listener() {
@Override
public ListenableFuture<SessionResult> onCustomCommand(
MediaController controller, SessionCommand command, Bundle args) {
// Handle custom command.
return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS));
}
@Override
public void onDisconnected(MediaController controller) {
// Handle disconnection.
}
})
.buildAsync();
अन्य कॉम्पोनेंट की तरह ही, जब MediaController
की ज़रूरत न हो, तब उसे रिलीज़ करना न भूलें. जैसे, Activity
या Fragment
के onStop()
तरीके में.
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
कंट्रोलर को रिलीज़ करने पर भी, सेशन को भेजी गई सभी प्रोसेस नहीं की गई कमांड डिलीवर की जाएंगी. साथ ही, सेशन सेवा से सिर्फ़ तब अनबाइंड किया जाएगा, जब इन कमांड को हैंडल कर लिया गया हो या टाइमआउट की अवधि खत्म हो गई हो. इनमें से जो भी पहले होगा.
MediaBrowser
MediaBrowser
, MediaController
की सुविधाओं के साथ-साथ मीडिया ऐप्लिकेशन के MediaLibraryService
की मीडिया लाइब्रेरी को ब्राउज़ करने की सुविधा भी देता है.
MediaBrowser
बनाएं
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());
MediaBrowser
का इस्तेमाल करना
मीडिया ऐप्लिकेशन की कॉन्टेंट लाइब्रेरी ब्राउज़ करने के लिए, सबसे पहले 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());
इसके बाद, मीडिया लाइब्रेरी में मौजूद MediaItem
के बच्चों को getChildren()
के साथ लाइब्रेरी में जाकर, मीडिया लाइब्रेरी को ऐक्सेस किया जा सकता है. उदाहरण के लिए, रूट नोड 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());
किसी दूसरे मीडिया ऐप्लिकेशन के लिए, प्लेबैक कंट्रोल दिखाना
किसी दूसरे मीडिया ऐप्लिकेशन के लिए बटन वाले यूज़र इंटरफ़ेस (यूआई) कंट्रोल दिखाते समय, यह ज़रूरी है कि उस ऐप्लिकेशन के लिए मीडिया बटन की तय की गई सेटिंग का पालन किया जाए.
ऐप्लिकेशन की प्राथमिकताओं और यूज़र इंटरफ़ेस (यूआई) की पाबंदियों और ज़रूरी शर्तों को हल करने का सबसे अच्छा तरीका, CommandButton.DisplayConstraints
का इस्तेमाल करना है. आपके पास यह तय करने का विकल्प होता है कि यूज़र इंटरफ़ेस (यूआई) क्या-क्या कर सकता है. साथ ही, resolve
तरीके से, आइकॉन, पोज़िशन, और कार्रवाई के साथ दिखाने के लिए बटन की सूची मिलती है.