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, SDK टूल का पाथ सेट करने के लिए आपसे कहेगा. अगर आपको कोई समस्या आती है, तो IDE और SDK टूल को अपडेट करने के सुझावों का पालन करें.
अगर आपसे 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 के इंस्टैंशिएशन का पता लगाएं और mediaSession
को शुरू करने के बाद TimelineQueueNavigator को लागू करें.
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.+'