1. परिचय
पिछली बार अपडेट किया गया: 09-09-2020
वीडियो चलाने के दौरान MediaSession जोड़ने के क्या फ़ायदे हैं?
मीडिया सेशन, Android प्लैटफ़ॉर्म और मीडिया ऐप्लिकेशन के बीच एक अहम लिंक होते हैं. इससे Android को यह पता चलता है कि मीडिया चल रहा है, ताकि वह मीडिया से जुड़ी कार्रवाइयों को सही सेशन में भेज सके. साथ ही, इससे प्लैटफ़ॉर्म को यह भी पता चलता है कि क्या चल रहा है और इसे कैसे कंट्रोल किया जा सकता है.
अपने ऐप्लिकेशन के ज़रिए MediaSession को उपलब्ध कराने के कई फ़ायदे हैं. उपयोगकर्ताओं को इनका फ़ायदा मिलेगा. यहां कुछ बेहतरीन उदाहरण दिए गए हैं.
Google Assistant
उपयोगकर्ता, "रोको", "फिर से शुरू करो", और "अगला" जैसे बोलकर दिए जाने वाले निर्देशों की मदद से, आपके ऐप्लिकेशन में मौजूद मीडिया से आसानी से इंटरैक्ट कर सकते हैं. फ़िलहाल क्या चल रहा है, इस बारे में जवाब पाने के लिए आपके मीडिया के मेटाडेटा का भी इस्तेमाल किया जा सकता है.
Android TV
बड़ी स्क्रीन पर ऐप्लिकेशन इस्तेमाल करने के दौरान, आपका Android TV का ऐप्लिकेशन, HDMI-CEC की सुविधा वाले टीवी इस्तेमाल करने वाले लोगों के लिए, सामान्य रिमोट कंट्रोल का इस्तेमाल कर सकता है. चलाएं/रोकें, रोकें, अगला और पिछला बटन दबाने पर दिए गए निर्देश, आपके ऐप्लिकेशन को भेजे जाते हैं.
स्क्रीन पर दिखने वाले मीडिया कंट्रोल
Android 4.0 (एपीआई लेवल 14) और इसके बाद के वर्शन में, सिस्टम किसी मीडिया सेशन की प्लेबैक स्थिति और मेटाडेटा को ऐक्सेस कर सकता है. इस सुविधा की मदद से, लॉक स्क्रीन पर मीडिया कंट्रोल और आर्टवर्क दिखाए जा सकते हैं. यह सुविधा, Android के वर्शन के हिसाब से अलग-अलग तरीके से काम करती है.
बैकग्राउंड मीडिया
इनमें से किसी भी स्थिति में मीडिया को कंट्रोल किया जा सकता है. भले ही, मीडिया चलाने वाला ऐप्लिकेशन बैकग्राउंड में चल रहा हो.
ऐंबियंट कंप्यूटिंग
मीडिया को यह जानकारी देकर कि क्या चल रहा है और उसे कैसे कंट्रोल किया जा सकता है, अलग-अलग डिवाइसों के बीच कनेक्टिविटी को बेहतर बनाया जा सकता है. इससे लोग मीडिया के साथ अलग-अलग तरीकों से इंटरैक्ट कर पाते हैं और उन्हें इसका आनंद मिलता है.
आपको क्या बनाने को मिलेगा
इस कोडलैब में, मीडिया सेशन की सुविधा जोड़ने के लिए, मौजूदा Exoplayer सैंपल को बढ़ाया जाएगा. आपका ऐप्लिकेशन:
- मीडिया सेशन की चालू स्थिति को सही तरीके से दिखाना
- मीडिया कंट्रोल को ExoPlayer पर रिले करना
- कतार में मौजूद आइटम का मेटाडेटा, मीडिया सेशन में पास करना
आपको क्या सीखने को मिलेगा
- मीडिया सेशन से उपयोगकर्ताओं को बेहतर अनुभव क्यों मिलता है
- मीडिया सेशन बनाने और उसकी स्थिति को मैनेज करने का तरीका
- मीडिया सेशन को ExoPlayer से कनेक्ट करने का तरीका
- मीडिया सेशन में, मीडिया चलाने के लिए तैयार की गई सूची में मौजूद आइटम का मेटाडेटा शामिल करने का तरीका
- अन्य (कस्टम) कार्रवाइयां जोड़ने का तरीका
इस कोडलैब में, MediaSession SDK के बारे में बताया गया है. इसमें काम के कॉन्सेप्ट और कोड ब्लॉक के बारे में नहीं बताया गया है. साथ ही, ExoPlayer को लागू करने के बारे में भी जानकारी नहीं दी गई है. हालांकि, इन्हें सिर्फ़ कॉपी और चिपकाने के लिए उपलब्ध कराया गया है.
आपको इन चीज़ों की ज़रूरत होगी
- Android Studio का नया वर्शन (3.5 या इसके बाद का वर्शन)
- Android ऐप्लिकेशन डेवलप करने की बुनियादी जानकारी
2. सेट अप करना
हम कहां से शुरुआत करें?
हमारा शुरुआती पॉइंट, ExoPlayer का मुख्य डेमो है. इस डेमो में, स्क्रीन पर वीडियो चलाने के कंट्रोल वाले वीडियो शामिल हैं. हालांकि, इसमें मीडिया सेशन का इस्तेमाल नहीं किया गया है. यह हमारे लिए एक शानदार जगह है, जहां हम इन सुविधाओं को जोड़ सकते हैं!
ExoPlayer का सैंपल पाना
आइए, ExoPlayer के सैंपल से शुरू करते हैं. नीचे दिया गया कोड चलाकर, GitHub रिपॉज़िटरी को क्लोन करें.
git clone https://github.com/google/ExoPlayer.git
डेमो खोलें
Android Studio में, demos/main में मौजूद मुख्य डेमो प्रोजेक्ट खोलें.
Android Studio, आपसे एसडीके का पाथ सेट करने के लिए कहेगा. अगर आपको कोई समस्या आती है, तो आईडीई और एसडीके टूल अपडेट करने के लिए दिए गए सुझावों का पालन करें.

अगर आपसे Gradle के नए वर्शन का इस्तेमाल करने के लिए कहा जाता है, तो उसे अपडेट करें.
कुछ समय निकालकर, यह समझें कि ऐप्लिकेशन को कैसे डिज़ाइन किया गया है. ध्यान दें कि यहां दो गतिविधियां हैं: SampleChooserActivity और PlayerActivity. हम कोडलैब के बाकी हिस्से में PlayerActivity का इस्तेमाल करेंगे. इसमें मीडिया चलता है. इसलिए, इस क्लास को खोलें और अगले सेक्शन पर जाएं.
3. मीडिया सेशन बनाना और उसकी स्थिति मैनेज करना
मीडिया सेशन बनाना
PlayerActivity.java खोलें. यह क्लास, ExoPlayer बनाती है और इसके फ़ंक्शन मैनेज करती है. जैसे, वीडियो को स्क्रीन पर रेंडर करना. इस गतिविधि में, हम ExoPlayer को मीडिया सेशन से कनेक्ट करेंगे.
क्लास में सबसे ऊपर, इन दो फ़ील्ड का एलान करें. हम इस पूरे सेक्शन में इन फ़ील्ड का इस्तेमाल करेंगे.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
आपको "Module: demo" के लिए, मॉड्यूल-लेवल build.gradle में "extension-mediasession" प्रोजेक्ट डिपेंडेंसी जोड़नी होगी:
implementation project(path: ':extension-mediasession')
ध्यान दें कि अगर आपको MediaSessionConnector को हल करने से जुड़ी गड़बड़ी पर कर्सर घुमाने पर, Android Studio इस डिपेंडेंसी को अपने-आप जोड़ने में मदद कर सकता है:

आखिर में, क्लास इंपोर्ट करने की समस्या को ठीक करने के लिए, यह जानकारी जोड़ें:
import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
गतिविधि बनाने के दौरान, हमें एक मीडिया सेशन और एक मीडिया सेशन कनेक्टर बनाना होगा. यह मीडिया सेशन और ExoPlayer के बीच मध्यस्थ के तौर पर काम करता है.
इसे उस जगह पर डाला जाना चाहिए जहां ExoPlayer बनाया गया है. हमारे डेमो ऐप्लिकेशन में, हम अपने कोड को initializePlayer() के आखिर में जोड़ सकते हैं. पक्का करें कि इस लॉजिक को प्लेयर के इंस्टैंटिएट होने के बाद जोड़ा गया हो!
private void initializePlayer() {
if (player == null) {
...
player = ...
...
mediaSession = new MediaSessionCompat(this, "sample");
mediaSessionConnector = new MediaSessionConnector(mediaSession);
mediaSessionConnector.setPlayer(player);
}
...
}
मीडिया सेशन को रिलीज़ करना
जब मीडिया सेशन की ज़रूरत न हो, तो उसे रिलीज़ करें. releasePlayer() में ExoPlayer को रिलीज़ करते समय, हम ऐसा करने के लिए यह कोड भी शामिल कर सकते हैं:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
मीडिया सेशन की स्थिति मैनेज करना
मीडिया सेशन शुरू करने के बाद, हमें यह पक्का करना होगा कि उपयोगकर्ता की गतिविधि के हिसाब से, मीडिया सेशन की स्थिति सही तरीके से दिखे.
जब उपयोगकर्ता गतिविधि शुरू करे, तो मीडिया सेशन चालू हो जाना चाहिए:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
हमारा ऐप्लिकेशन बैकग्राउंड में मीडिया नहीं चलाता है. इसलिए, यह पक्का करना ज़रूरी है कि जब उपयोगकर्ता गतिविधि छोड़ दे, तो मीडिया सेशन बंद हो जाए:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
आइए, डेमो देखते हैं
- किसी Android डिवाइस को अटैच करें या एम्युलेटर शुरू करें.
- पक्का करें कि Android Studio टूलबार से चलाने के लिए, "डेमो" चुना गया हो.

- Android Studio टूलबार में,
पर क्लिक करें. - आपके डिवाइस पर ऐप्लिकेशन लॉन्च होने के बाद, चलाने के लिए कोई वीडियो स्ट्रीम चुनें.
- वीडियो चलने के बाद, मीडिया सेशन को कंट्रोल करने के लिए, यहां दी गई
adbकमांड का इस्तेमाल करें:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
- यह भी जानें कि Android आपके मीडिया सेशन को कैसे देखता है. खास तौर पर, ऐक्शन फ़ील्ड में जाकर यह देखा जा सकता है कि कौनसे ऐक्शन काम करते हैं. आपको यहां जो संख्या दिख रही है वह PlaybackState ऑब्जेक्ट में बताए गए ऐक्शन आईडी का कॉम्बिनेशन है. मीडिया सेशन को चलाने के लिए:
adb shell dumpsys media_session - अगर माइक्रोफ़ोन वाले किसी फ़िज़िकल डिवाइस का इस्तेमाल किया जा रहा है, तो Google Assistant को चालू करके बोलकर निर्देश दें. जैसे: "रोकें." "फिर से चलाओ।" "एक मिनट के लिए तेज़ी से आगे बढ़ाओ."
*Android TV पर चल रहा ExoPlayer का सैंपल.*
4. इसमें वीडियो चलाने के लिए तैयार की गई सूची में मौजूद आइटम का मेटाडेटा भी शामिल है
अब हम अपने मीडिया सेशन की उन सुविधाओं को बढ़ा सकते हैं जिनके लिए हमने पहले initializePlayer() में MediaSessionConnector बनाया था.
TimelineQueueNavigator को जोड़ना
ExoPlayer, मीडिया के स्ट्रक्चर को टाइमलाइन के तौर पर दिखाता है. यह सुविधा कैसे काम करती है, इस बारे में जानने के लिए, ExoPlayer के टाइमलाइन ऑब्जेक्ट के बारे में पढ़ें. इस स्ट्रक्चर का इस्तेमाल करके, हमें कॉन्टेंट में होने वाले बदलावों के बारे में सूचना मिलती है. साथ ही, जब कोई व्यक्ति हमसे यह पूछता है कि फ़िलहाल क्या चल रहा है, तो हम उसे उस कॉन्टेंट का मेटाडेटा दिखा सकते हैं.
इसके लिए, हम TimelineQueueNavigator को तय करेंगे. initializePlayer() में MediaSessionConnector का इंस्टैंटिएशन ढूंढें. इसके बाद, TimelineQueueNavigator को लागू करने का तरीका जोड़ें. ऐसा mediaSession के शुरू होने के बाद करें.
mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
@Override
public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
return new MediaDescriptionCompat.Builder()
.setTitle(player.getCurrentMediaItem().mediaMetadata.title)
.setDescription("MediaDescription description for " + windowIndex)
.setSubtitle("MediaDescription subtitle")
.build();
}
});
क्लास इंपोर्ट करने से जुड़ी समस्याएं हल करने के लिए, ये जोड़ें:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
ध्यान दें कि windowIndex पैरामीटर, प्लेबैक क्यू में उस इंडेक्स के आइटम से मेल खाता है.
मेटाडेटा जोड़ने के बाद, यह जांच की जा सकती है कि Assistant को यह समझ आ रहा है या नहीं कि क्या चल रहा है. Android TV पर वीडियो चलाते समय, Assistant को चालू करें और पूछें कि "क्या चल रहा है?"

5. कार्रवाइयों को पसंद के मुताबिक बनाना
ऐसा हो सकता है कि आपका प्लेयर कुछ कार्रवाइयों के साथ काम न करता हो या आपको ज़्यादा कार्रवाइयों के लिए सहायता शामिल करनी हो? अब हम मीडिया सेशन के बारे में ज़्यादा जानकारी देंगे. हमने initializePlayer() में MediaSessionConnector बनाया था.
साथ काम करने वाली कार्रवाइयों के बारे में बताना
mediaSessionConnector.setEnabledPlaybackActions() का इस्तेमाल करके, यह तय करें कि मीडिया सेशन में कौनसी कार्रवाइयां की जा सकती हैं.
ध्यान दें कि पूरा सेट यह है:
mediaSessionConnector.setEnabledPlaybackActions(
PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_PLAY
| PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_SEEK_TO
| PlaybackStateCompat.ACTION_FAST_FORWARD
| PlaybackStateCompat.ACTION_REWIND
| PlaybackStateCompat.ACTION_STOP
| PlaybackStateCompat.ACTION_SET_REPEAT_MODE
| PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);
आइए, फिर से देखते हैं कि यह डेटा प्लैटफ़ॉर्म पर कैसे दिखता है:
- पहले की तरह, कोई वीडियो शुरू करें.
- यह एक्सप्लोर करें कि Android, आपके मीडिया सेशन के मेटाडेटा को कैसे देखता है. इसके लिए, यह कमांड चलाएं:
adb shell dumpsys media_session - मेटाडेटा वाली लाइन ढूंढें और देखें कि टाइटल और ब्यौरा शामिल किया गया है और
com.google.android.exoplayer2.demo/sampleसे जुड़ा है.
अन्य कार्रवाइयां जोड़ना
हम कुछ और कार्रवाइयां करके, मीडिया सेशन को बढ़ा सकते हैं. इस सेक्शन में, हम सिर्फ़ कैप्शन जोड़ने की सुविधा उपलब्ध कराएंगे.
कैप्शन की सुविधा
मीडिया सेशन में कैप्शन की सुविधा जोड़ने से, लोग आवाज़ से कैप्शन को टॉगल कर सकते हैं. आपने मीडिया सेशन कनेक्टर को जहां शुरू किया था वहां यह कोड जोड़ें:
mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
@Override
public void onSetCaptioningEnabled(Player player, boolean enabled) {
Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
}
@Override
public boolean hasCaptions(Player player) {
return true;
}
@Override
public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
return false;
}
}
);
आखिर में, इंपोर्ट न किए गए डेटा की समस्या हल करें.
इसे आज़माने के लिए, Android TV पर Google Assistant को चालू करें और "कैप्शन चालू करो" कहें. मैसेज के लिए Logcat देखें, ताकि यह पता चल सके कि यह आपके कोड में कैसे कॉल करता है.
6. बधाई हो
बधाई हो, आपने सैंपल में मीडिया सेशन जोड़ दिए हैं!
आपको ये सुविधाएं मिली हैं:
- मीडिया सेशन जोड़ना,
- मीडिया सेशन को ExoPlayer के किसी इंस्टेंस से कनेक्ट करना,
- मेटाडेटा और अन्य कार्रवाइयां जोड़ना.
अब आपको मीडिया ऐप्लिकेशन को बेहतर बनाने और उपयोगकर्ताओं को ज़्यादा विकल्प देने के लिए ज़रूरी चरणों के बारे में पता चल गया है!
फ़ाइनल टिप्पणी
यह कोडलैब, ExoPlayer के सोर्स कोड के सैंपल पर आधारित है. सोर्स से ExoPlayer का इस्तेमाल करने की ज़रूरत नहीं है. हमारा सुझाव है कि आप ExoPlayer और MediaSessionConnector के लिए डिपेंडेंसी पुल करें, ताकि नई रिलीज़ के बारे में अपडेट पाना आसान हो.
इसके लिए, प्रोजेक्ट की डिपेंडेंसी को बदलें. जैसे:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
Maven रिपॉज़िटरी से पुल करने के लिए, जैसे कि:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'