Mediasession की मदद से मीडिया को कंट्रोल करना

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

10e3b5c652186d57.png

अगर आपसे 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 इस डिपेंडेंसी को अपने-आप जोड़ने में आपकी मदद कर सकता है. इसके लिए, गड़बड़ी पर कर्सर घुमाएं:

60055e4ad54fbb97.png

आखिर में, क्लास इंपोर्ट करने की समस्या को ठीक करने के लिए, यह जानकारी जोड़ें:

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);
  }
  ...
}

मीडिया सेशन को रिलीज़ करना

जब मीडिया सेशन की ज़रूरत न हो, तो उसे रिलीज़ करें. ExoPlayer को releasePlayer() में रिलीज़ करते समय, हम ऐसा करने के लिए यह कोड भी शामिल कर सकते हैं:

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);
  }
  ...
}

आइए, डेमो चलाएं

  1. किसी Android डिवाइस को अटैच करें या एम्युलेटर शुरू करें.
  2. पक्का करें कि Android Studio टूलबार से चलाने के लिए, "डेमो" चुना गया हो. cb1ec4e50886874f.png
  3. Android Studio टूलबार में, 9d8fb3a9ddf12827.png पर क्लिक करें.
  4. आपके डिवाइस पर ऐप्लिकेशन लॉन्च होने के बाद, चलाने के लिए कोई वीडियो स्ट्रीम चुनें.
  5. वीडियो चलने के बाद, मीडिया सेशन को कंट्रोल करने के लिए, यहां दी गई 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
  1. यह भी जानें कि Android आपके मीडिया सेशन को कैसे देखता है. खास तौर पर, ऐक्शन फ़ील्ड में जाकर यह देखा जा सकता है कि कौनसे ऐक्शन काम करते हैं. आपको यहां जो संख्या दिख रही है वह ऐक्शन आईडी का कॉम्बिनेशन है. इसे PlaybackState ऑब्जेक्ट में बताया गया है. मीडिया सेशन को चलाने के लिए: adb shell dumpsys media_session
  2. अगर माइक्रोफ़ोन वाले किसी फ़िज़िकल डिवाइस का इस्तेमाल किया जा रहा है, तो Google Assistant को चालू करके बोलकर निर्देश दें. जैसे: "रोकें." "फिर से चलाओ।" "एक मिनट के लिए तेज़ी से आगे बढ़ाओ."

b8dda02a6fb0f6a4.pngAndroid 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 को चालू करें और पूछें कि "क्या चल रहा है?"

6c7fc0cb853cbc38.png

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
);

आइए, फिर से देखते हैं कि यह डेटा प्लैटफ़ॉर्म पर कैसे दिखता है:

  1. पहले की तरह, कोई वीडियो शुरू करें.
  2. यह एक्सप्लोर करें कि Android, आपके मीडिया सेशन से मेटाडेटा को कैसे देखता है. इसके लिए, यह कमांड चलाएं: adb shell dumpsys media_session
  3. मेटाडेटा वाली लाइन ढूंढें और देखें कि टाइटल और ब्यौरा शामिल है और 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.+'

रेफ़रंस दस्तावेज़