Android TV ऐप्लिकेशन को कास्ट करने की सुविधा

1. खास जानकारी

Google Cast का लोगो

यह कोडलैब आपको मौजूदा Android TV ऐप्लिकेशन में बदलाव करने का तरीका बताएगा, ताकि कास्ट करने वाले मौजूदा ऐप्लिकेशन से कास्ट करने और बातचीत करने की सुविधा मिल सके.

Google Cast और Cast Connect क्या है?

Google Cast, उपयोगकर्ताओं को मोबाइल डिवाइस से टीवी पर कॉन्टेंट कास्ट करने की सुविधा देता है. आम तौर पर Google Cast सेशन में दो कॉम्पोनेंट होते हैं — भेजने वाले का नाम और रिसीवर ऐप्लिकेशन. भेजने वाले ऐप्लिकेशन, जैसे कि मोबाइल ऐप्लिकेशन या वेबसाइट जैसे YouTube.com, Cast रिसीवर ऐप्लिकेशन को चलाने की सुविधा देते हैं और उसे कंट्रोल करते हैं. कास्ट किए जाने वाले ऐप्लिकेशन, HTML 5 ऐप्लिकेशन होते हैं. ये Chromecast और Android TV डिवाइसों पर चलते हैं.

कास्ट सेशन की करीब-करीब पूरी स्थिति, रिसीवर ऐप्लिकेशन पर सेव होती है. जब स्टेटस अपडेट होता है, तो ईमेल भेजने वाले सभी लोगों को मीडिया स्टेटस ब्रॉडकास्ट होता है. जैसे, कोई नया मीडिया आइटम लोड होने पर. इन ब्रॉडकास्ट में कास्ट सेशन की मौजूदा स्थिति देखी जा सकती है. भेजने वाले ऐप्लिकेशन इस मीडिया स्थिति का इस्तेमाल, अपने यूज़र इंटरफ़ेस (यूआई) में प्लेबैक की जानकारी दिखाने के लिए करते हैं.

Cast Connect इस इंफ़्रास्ट्रक्चर में सबसे ऊपर बनता है. इसमें आपका Android TV ऐप्लिकेशन, रिसीवर की तरह काम करता है. Cast Connect लाइब्रेरी की मदद से आपका Android TV ऐप्लिकेशन, मैसेज और ब्रॉडकास्ट मीडिया का स्टेटस देख सकता है. ऐसा करके, वह किसी कास्ट रिसीवर ऐप्लिकेशन की तरह ही कास्ट करता है.

हम क्या बनाने जा रहे हैं?

इस कोडलैब को पूरा करने के बाद, किसी Android TV ऐप्लिकेशन पर वीडियो कास्ट करने के लिए, कास्ट करने वाले ऐप्लिकेशन का इस्तेमाल किया जा सकेगा. कास्ट प्रोटोकॉल की मदद से भी Android TV ऐप्लिकेशन, कॉन्टेंट भेजने वाले ऐप्लिकेशन से बातचीत कर सकता है.

आपको क्या सीखने को मिलेगा

  • ATV ऐप्लिकेशन के सैंपल में Cast Connect लाइब्रेरी जोड़ने का तरीका जानें.
  • कास्ट करने वाले डिवाइस से कनेक्ट करने और ATV ऐप्लिकेशन को लॉन्च करने का तरीका.
  • कास्ट करने वाले ऐप्लिकेशन से ATV ऐप्लिकेशन पर मीडिया चलाने का तरीका.
  • ATV ऐप्लिकेशन से कास्ट करने वाले ऐप्लिकेशन पर मीडिया की स्थिति भेजने का तरीका.

आपको किन चीज़ों की ज़रूरत होगी

2. सैंपल कोड पाएं

आप सभी नमूना कोड अपने कंप्यूटर पर डाउनलोड कर सकते हैं...

और डाउनलोड की गई ZIP फ़ाइल को अनपैक करें.

3. सैंपल ऐप्लिकेशन चलाएं

सबसे पहले, आइए देखते हैं कि पूरा हो चुका सैंपल ऐप्लिकेशन कैसा दिखता है. Android TV ऐप्लिकेशन, Leanback यूज़र इंटरफ़ेस (यूआई) और बेसिक वीडियो प्लेयर का इस्तेमाल करता है. उपयोगकर्ता ऐसी सूची से वीडियो चुन सकता है जो चुने जाने पर टीवी पर चलता है. मोबाइल से भेजने वाले ऐप्लिकेशन की मदद से, उपयोगकर्ता Android TV ऐप्लिकेशन पर भी वीडियो कास्ट कर सकता है.

वीडियो के थंबनेल की सीरीज़ की इमेज (जिसमें से एक को हाइलाइट किया गया है) वीडियो की फ़ुल-स्क्रीन झलक को ओवरले कर रही है; 'Cast Connect' शब्द ऊपर दाईं ओर दिख रहा है

डेवलपर डिवाइस रजिस्टर करें

ऐप्लिकेशन डेवलपमेंट के लिए Cast Connect की सुविधाएं चालू करने के लिए, आपको Android TV डिवाइस में पहले से मौजूद Chromecast का सीरियल नंबर रजिस्टर करना होगा. इसका इस्तेमाल Cast Developer Console में किया जाएगा. सीरियल नंबर ढूंढने के लिए, Settings > पर जाएं डिवाइस की सेटिंग > Chromecast बिल्ट-इन > आपके Android TV पर सीरियल नंबर. ध्यान दें कि यह आपके डिवाइस के सीरियल नंबर से अलग है और इसे ऊपर बताए गए तरीके से लेना चाहिए.

Android TV की स्क्रीन की इमेज, जिसमें 'Chromecast बिल्ट-इन' दिख रहा है स्क्रीन, वर्शन नंबर और सीरियल नंबर

पंजीकरण के बिना, Cast Connect केवल सुरक्षा कारणों से Google Play Store से इंस्टॉल किए गए ऐप्लिकेशन के लिए काम करेगा. रजिस्ट्रेशन की प्रोसेस शुरू होने के 15 मिनट बाद, अपना डिवाइस रीस्टार्ट करें.

Android सेंडर ऐप्लिकेशन इंस्टॉल करना

मोबाइल डिवाइस से अनुरोध भेजने की जांच करने के लिए, हमने सोर्स कोड की पिन कोड वाली पिन फ़ाइल में, ईमेल भेजने वाले व्यक्ति के लिए एक सामान्य ऐप्लिकेशन उपलब्ध कराया है. इसे mobile-sender-0629.apk फ़ाइल के तौर पर कास्ट वीडियो कहते हैं. हम APK इंस्टॉल करने के लिए ADB का इस्तेमाल करेंगे. अगर आपने पहले से ही 'वीडियो कास्ट करें' सुविधा का कोई दूसरा वर्शन इंस्टॉल किया हुआ है, तो आगे बढ़ने से पहले, कृपया उस वर्शन को डिवाइस पर मौजूद सभी प्रोफ़ाइलों से अनइंस्टॉल कर दें.

  1. अपने Android फ़ोन पर डेवलपर के लिए सेटिंग और टूल की सुविधा और यूएसबी डीबग करने की सुविधा चालू करें.
  2. अपने Android फ़ोन को डेवलपमेंट कंप्यूटर से कनेक्ट करने के लिए, यूएसबी डेटा केबल को प्लग-इन करें.
  3. अपने Android फ़ोन पर mobile-sender-0629.apk को इंस्टॉल करें.

ऐसी टर्मिनल विंडो की इमेज जिसमें adsb इंस्टॉल करने का निर्देश दिया जा रहा हो. इस विंडो की मदद से, मोबाइल-भेजने वाले की जानकारी को इंस्टॉल किया जा सकता है.

  1. आपको अपने Android फ़ोन पर, वीडियो कास्ट करने की सुविधा देने वाला ऐप्लिकेशन मिल सकता है. 'कास्ट वीडियो' भेजने वाले ऐप्लिकेशन का आइकॉन

Android फ़ोन की स्क्रीन पर, Cast वीडियो भेजने वाले ऐप्लिकेशन की इमेज

Android TV ऐप्लिकेशन इंस्टॉल करें

यहां दिए गए निर्देशों में, Android Studio में सैंपल ऐप्लिकेशन को खोलने और चलाने का तरीका बताया गया है:

  1. स्वागत स्क्रीन पर प्रोजेक्ट इंपोर्ट करें चुनें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू के विकल्प.
  2. सैंपल कोड फ़ोल्डर से फ़ोल्डर का आइकॉनapp-done डायरेक्ट्री चुनें और 'ठीक है' पर क्लिक करें.
  3. फ़ाइल > Gradle बटन के साथ Android App Studio का प्रोजेक्ट सिंक करना Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें.
  4. अपने Android TV डिवाइस पर, डेवलपर के लिए सेटिंग और टूल की सुविधा और यूएसबी डीबग करने की सुविधा चालू करें.
  5. ADB को अपने Android TV डिवाइस से कनेक्ट करें. डिवाइस Android Studio में दिखना चाहिए. Android Studio के टूलबार में Android TV डिवाइस की इमेज
  6. Android Studio का 'रन' बटन, दाईं ओर दिखाने वाला हरा त्रिभुजRun बटन पर क्लिक करने के बाद, आपको कुछ सेकंड के बाद Cast Connect कोडलैब नाम का एटीवी ऐप्लिकेशन दिखेगा.

Cast Connect with ATV ऐप्लिकेशन चलाएं

  1. Android TV की होम स्क्रीन पर जाएं.
  2. अपने Android फ़ोन पर, Cast वीडियो भेजने वाले व्यक्ति का ऐप्लिकेशन खोलें. 'कास्ट करें' बटन कास्ट बटन का आइकॉन पर क्लिक करें और अपना ATV डिवाइस चुनें.
  3. आपके ATV पर Cast Connect कोडलैब ATV ऐप्लिकेशन लॉन्च किया जाएगा. इसके बाद, मैसेज भेजने वाले डिवाइस पर कास्ट बटन से पता चलेगा कि यह ऐप्लिकेशन, कास्ट बटन का आइकॉन और उलटे रंगों का इस्तेमाल से कनेक्ट है.
  4. ATV ऐप्लिकेशन में जाकर, कोई वीडियो चुनें. इसके बाद, वीडियो आपके ATV पर चलने लगेगा.
  5. आपके मोबाइल फ़ोन पर, अब आपको भेजने वाले ऐप्लिकेशन के नीचे एक मिनी कंट्रोलर दिखेगा. प्लेबैक को कंट्रोल करने के लिए, चलाएं/रोकें बटन का इस्तेमाल किया जा सकता है.
  6. अपने मोबाइल फ़ोन से कोई वीडियो चुनें और उसे चलाएं. वीडियो आपके ATV पर चलना शुरू हो जाएगा और आपके मोबाइल से भेजने वाले डिवाइस पर बड़ा किया गया कंट्रोलर दिखेगा.
  7. अपना फ़ोन लॉक करने के बाद, इसे अनलॉक करने पर आपको लॉक स्क्रीन पर एक सूचना दिखेगी. इससे मीडिया प्लेबैक को कंट्रोल करने या कास्ट करने की सुविधा को रोका जा सकेगा.

Android फ़ोन की स्क्रीन के एक सेक्शन की इमेज, जिसमें मिनी प्लेयर पर वीडियो चल रहा है

4. शुरुआती प्रोजेक्ट तैयार करना

अब जब हमने ऐप्लिकेशन के Cast Connect इंटिग्रेशन की पुष्टि कर ली है, तो अब हमें आपके डाउनलोड किए गए स्टार्ट ऐप्लिकेशन में Cast Connect के लिए सहायता उपलब्ध कराने की ज़रूरत है. अब आप Android Studio का इस्तेमाल करके, शुरुआती प्रोजेक्ट पर काम करने के लिए तैयार हैं:

  1. स्वागत स्क्रीन पर प्रोजेक्ट इंपोर्ट करें चुनें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू के विकल्प.
  2. सैंपल कोड फ़ोल्डर से फ़ोल्डर का आइकॉनapp-start डायरेक्ट्री चुनें और 'ठीक है' पर क्लिक करें.
  3. फ़ाइल > Gradle बटन के साथ Android Studio का सिंक प्रोजेक्ट Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें.
  4. ATV डिवाइस चुनें. इसके बाद, ऐप्लिकेशन को चलाने और यूज़र इंटरफ़ेस (यूआई) एक्सप्लोर करने के लिए, Android Studio का 'रन' बटन, एक हरे रंग का त्रिभुज, जो दाईं ओर इशारा करता हैचलाएं बटन पर क्लिक करें. Android Studio का टूलबार, चुना गया Android TV डिवाइस दिखा रहा है

वीडियो के थंबनेल की सीरीज़ की इमेज (जिसमें से एक को हाइलाइट किया गया है) वीडियो की फ़ुल-स्क्रीन झलक को ओवरले कर रही है; 'Cast Connect' शब्द ऊपर दाईं ओर दिख रहा है

ऐप डिज़ाइन

यह ऐप्लिकेशन, उपयोगकर्ताओं को ब्राउज़ करने के लिए वीडियो की सूची उपलब्ध कराता है. उपयोगकर्ता Android TV पर चलाने के लिए वीडियो चुन सकते हैं. ऐप्लिकेशन में दो मुख्य गतिविधियां हैं: MainActivity और PlaybackActivity.

MainActivity

इस गतिविधि में एक फ़्रैगमेंट (MainFragment) है. वीडियो की सूची और उनसे जुड़े मेटाडेटा को MovieList क्लास में कॉन्फ़िगर किया जाता है. साथ ही, Movie ऑब्जेक्ट की सूची बनाने के लिए, setupMovies() तरीके को कॉल किया जाता है.

Movie ऑब्जेक्ट, टाइटल, ब्यौरे, इमेज के थंबनेल, और वीडियो यूआरएल के साथ वीडियो की इकाई को दिखाता है. हर Movie ऑब्जेक्ट को एक CardPresenter से तय किया जाता है, ताकि वीडियो थंबनेल को टाइटल और स्टूडियो के साथ दिखाया जा सके और ArrayObjectAdapter को भेजा जा सके.

कोई आइटम चुनने पर, उससे जुड़ा Movie ऑब्जेक्ट PlaybackActivity को पास कर दिया जाता है.

PlaybackActivity

इस गतिविधि में एक ऐसा फ़्रैगमेंट (PlaybackVideoFragment) शामिल है जो ExoPlayer के साथ VideoView को होस्ट करता है. साथ ही, कुछ मीडिया कंट्रोल और एक टेक्स्ट एरिया भी होता है, जो चुने गए वीडियो की जानकारी दिखाता है. साथ ही, यह उपयोगकर्ता को Android TV पर वीडियो चलाने की सुविधा देता है. उपयोगकर्ता, रिमोट कंट्रोल का इस्तेमाल करके वीडियो चला/रोक सकता है या चलाना जारी रख सकता है.

Cast Connect से जुड़ी ज़रूरी शर्तें

Cast Connect, Google Play सेवाओं के नए वर्शन का इस्तेमाल करता है. इनके लिए, AndroidX नेमस्पेस का इस्तेमाल करने के लिए, आपके ATV ऐप्लिकेशन को अपडेट करना ज़रूरी है.

अपने Android TV ऐप्लिकेशन में Cast Connect की सुविधा इस्तेमाल करने के लिए, आपको मीडिया सेशन से इवेंट बनाने होंगे और उनमें कोई बदलाव करने की सुविधा देनी होगी. Cast Connect लाइब्रेरी, मीडिया सेशन की स्थिति के आधार पर मीडिया स्टेटस जनरेट करती है. आपके मीडिया सेशन का इस्तेमाल Cast Connect लाइब्रेरी से भी किया जाता है. इसकी मदद से, आपको यह पता चलता है कि आपको भेजने वाले किसी व्यक्ति से कुछ मैसेज मिले हैं. जैसे, मीडिया सेशन को रोकना.

5. कास्ट सपोर्ट को कॉन्फ़िगर करना

डिपेंडेंसी

ज़रूरी लाइब्रेरी डिपेंडेंसी शामिल करने के लिए, ऐप्लिकेशन build.gradle फ़ाइल को अपडेट करें:

dependencies {
    ....

    // Cast Connect libraries
    implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
    implementation 'com.google.android.gms:play-services-cast:21.1.0'
}

प्रोजेक्ट को बिना किसी गड़बड़ी के सिंक करने के लिए सिंक करें.

डेटा लेयर में इवेंट बनाने की प्रोसेस

CastReceiverContext, सभी कास्ट इंटरैक्शन को सिंक करने के लिए सिंगलटन ऑब्जेक्ट है. CastReceiverContext शुरू करने के बाद, CastReceiverOptions देने के लिए आपको ReceiverOptionsProvider इंटरफ़ेस लागू करना होगा.

CastReceiverOptionsProvider.kt फ़ाइल बनाएं और प्रोजेक्ट में यह क्लास जोड़ें:

package com.google.sample.cast.castconnect

import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions

class CastReceiverOptionsProvider : ReceiverOptionsProvider {
    override fun getOptions(context: Context): CastReceiverOptions {
        return CastReceiverOptions.Builder(context)
                .setStatusText("Cast Connect Codelab")
                .build()
    }
}

इसके बाद, ऐप्लिकेशन AndroidManifest.xml फ़ाइल के <application> टैग में, रिसीवर के लिए विकल्प उपलब्ध कराने वाली कंपनी की जानकारी दें:

<application>
  ...
  <meta-data
    android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>

कास्ट करने वाले डिवाइस के ज़रिए ATV ऐप्लिकेशन से कनेक्ट करने के लिए, कोई ऐसी गतिविधि चुनें जिसे लॉन्च करना है. इस कोडलैब में, कास्ट सेशन के शुरू होने पर, हम ऐप्लिकेशन का MainActivity लॉन्च करेंगे. AndroidManifest.xml फ़ाइल में, MainActivity में लॉन्च इंटेंट फ़िल्टर जोड़ें.

<activity android:name=".MainActivity">
  ...
  <intent-filter>
    <action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

कास्ट पाने वाले की कॉन्टेक्स्ट लाइफ़साइकल

आपका ऐप्लिकेशन लॉन्च होने पर, आपको CastReceiverContext शुरू करना चाहिए और बैकग्राउंड में ले जाते समय, CastReceiverContext को बंद करना चाहिए. हमारा सुझाव है कि कॉल करने की प्रक्रिया को मैनेज करने के लिए, androidx.lifecycle लाइब्रेरी से LifecycleObserver का इस्तेमाल करें CastReceiverContext.start() और CastReceiverContext.stop()

MyApplication.kt फ़ाइल खोलें, ऐप्लिकेशन के onCreate तरीके में initInstance() को कॉल करके कास्ट कॉन्टेक्स्ट शुरू करें. AppLifeCycleObserver क्लास में start() ऐप्लिकेशन को फिर से शुरू करने पर CastReceiverContext और ऐप्लिकेशन रोके जाने पर stop():

package com.google.sample.cast.castconnect

import com.google.android.gms.cast.tv.CastReceiverContext
...

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CastReceiverContext.initInstance(this)
        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
    }

    class AppLifecycleObserver : DefaultLifecycleObserver {
        override fun onResume(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onResume")
            CastReceiverContext.getInstance().start()
        }

        override fun onPause(owner: LifecycleOwner) {
            Log.d(LOG_TAG, "onPause")
            CastReceiverContext.getInstance().stop()
        }
    }
}

Mediasession को MediaManager से कनेक्ट किया जा रहा है

MediaManager, CastReceiverContext सिंगलटन की प्रॉपर्टी है. यह मीडिया के स्टेटस को मैनेज करती है और कॉन्टेंट लोड करने के इंटेंट को हैंडल करती है. यह मैसेज भेजने वालों के मीडिया नेमस्पेस मैसेज को मीडिया के निर्देशों में अनुवाद करती है और मीडिया भेजने वालों को वापस भेजती है.

MediaSession बनाते समय, आपको MediaManager को मौजूदा MediaSession टोकन भी देना होगा, ताकि उसे पता चल सके कि निर्देश कहां भेजने हैं और मीडिया प्लेबैक की स्थिति क्या है. PlaybackVideoFragment.kt फ़ाइल में, MediaManager पर टोकन सेट करने से पहले, पक्का करें कि MediaSession शुरू किया गया हो.

import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...

class PlaybackVideoFragment : VideoSupportFragment() {
    private var castReceiverContext: CastReceiverContext? = null
    ...

    private fun initializePlayer() {
        if (mPlayer == null) {
            ...
            mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
            ...
            castReceiverContext = CastReceiverContext.getInstance()
            if (castReceiverContext != null) {
                val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
                mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
            }

        }
    }
}

जब प्लेबैक बंद होने की वजह से MediaSession को रिलीज़ किया जाता है, तो आपको MediaManager पर शून्य टोकन सेट करना चाहिए:

private fun releasePlayer() {
    mMediaSession?.release()
    castReceiverContext?.mediaManager?.setSessionCompatToken(null)
    ...
}

सैंपल के तौर पर ऐप्लिकेशन चलाएं

अपने ATV डिवाइस पर ऐप्लिकेशन को डिप्लॉय करने के लिए, Android Studio का &#39;रन&#39; बटन, एक हरे रंग का त्रिभुज, जो दाईं ओर इशारा करता हैRun बटन पर क्लिक करें. इसके बाद, ऐप्लिकेशन को बंद करें और ATV की होम स्क्रीन पर वापस जाएं. जिस व्यक्ति को न्योता भेजा गया है उसके नाम के आगे मौजूद, 'कास्ट करें' बटन कास्ट बटन का आइकॉन पर क्लिक करें और अपना ATV डिवाइस चुनें. आपको दिखेगा कि ATV डिवाइस पर ATV ऐप्लिकेशन लॉन्च हो गया है और 'कास्ट करें' बटन कनेक्ट हो गया है.

6. मीडिया लोड हो रहा है

लोड निर्देश को डेवलपर कंसोल में आपके तय किए गए पैकेज के नाम के साथ इंटेंट के ज़रिए भेजा जाता है. आपको अपने Android TV ऐप्लिकेशन में, पहले से तय इंटेंट फ़िल्टर जोड़ना होगा, ताकि यह तय किया जा सके कि किस गतिविधि को टारगेट किया जाएगा. AndroidManifest.xml फ़ाइल में, लोड इंटेंट फ़िल्टर को PlayerActivity में जोड़ें:

<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
          android:launchMode="singleTask"
          android:exported="true">
  <intent-filter>
     <action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
     <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Android TV पर कॉन्टेंट लोड करने के अनुरोधों को मैनेज करना

अब गतिविधि को, इस इंटेंट के साथ लोड करने के लिए कॉन्फ़िगर किया जा चुका है, इसलिए हमें इसे मैनेज करना होगा.

गतिविधि शुरू होने पर, ऐप्लिकेशन एक निजी तरीके को कॉल करता है, जिसे processIntent कहते हैं. इस तरीके में, आने वाले इंटेंट को प्रोसेस करने के लिए लॉजिक शामिल होता है. लोड करने के किसी अनुरोध को मैनेज करने के लिए, हम इस तरीके में बदलाव करेंगे. साथ ही, इंटेंट को आगे प्रोसेस करने के लिए भेजेंगे. इसके लिए, हम MediaManager इंस्टेंस के onNewIntent तरीके का इस्तेमाल करेंगे. अगर MediaManager को पता चलता है कि इंटेंट, लोड करने का एक अनुरोध है, तो यह इंटेंट से MediaLoadRequestData ऑब्जेक्ट को एक्सट्रैक्ट करता है और MediaLoadCommandCallback.onLoad() को शुरू करता है. लोड करने के अनुरोध वाले इंटेंट को हैंडल करने के लिए, PlaybackVideoFragment.kt फ़ाइल में processIntent तरीके में बदलाव करें:

fun processIntent(intent: Intent?) {
    val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
    // Pass intent to Cast SDK
    if (mediaManager.onNewIntent(intent)) {
        return
    }

    // Clears all overrides in the modifier.
    mediaManager.getMediaStatusModifier().clear()

    // If the SDK doesn't recognize the intent, handle the intent with your own logic.
    ...
}

इसके बाद, हम ऐब्स्ट्रैक्ट क्लास MediaLoadCommandCallback को बढ़ाएंगे, जो MediaManager के बताए गए onLoad() तरीके को बदल देगी. इस तरीके को लोड करने के अनुरोध का डेटा मिलता है और वह उसे Movie ऑब्जेक्ट में बदल देता है. कन्वर्ट किए जाने के बाद, स्थानीय प्लेयर ही फ़िल्म को चलाता है. इसके बाद, MediaManager को MediaLoadRequest की मदद से अपडेट कर दिया जाता है और MediaStatus को, कनेक्ट किए गए ईमेल पतों पर ब्रॉडकास्ट किया जाता है. PlaybackVideoFragment.kt फ़ाइल में, MyMediaLoadCommandCallback नाम से नेस्ट की गई निजी क्लास बनाएं:

import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...

private inner class MyMediaLoadCommandCallback :  MediaLoadCommandCallback() {
    override fun onLoad(
        senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
        Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
        return if (mediaLoadRequestData == null) {
            // Throw MediaException to indicate load failure.
            Tasks.forException(MediaException(
                MediaError.Builder()
                    .setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
                    .setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
                    .build()))
        } else Tasks.call {
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            // Update media metadata and state
            val mediaManager = castReceiverContext!!.mediaManager
            mediaManager.setDataFromLoad(mediaLoadRequestData)
            mediaLoadRequestData
        }
    }
}

private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
    if (mediaLoadRequestData == null) {
        return null
    }
    val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
    var videoUrl: String = mediaInfo.getContentId()
    if (mediaInfo.getContentUrl() != null) {
        videoUrl = mediaInfo.getContentUrl()
    }
    val metadata: MediaMetadata = mediaInfo.getMetadata()
    val movie = Movie()
    movie.videoUrl = videoUrl
    movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
    movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
    if(metadata?.hasImages() == true) {
        movie.cardImageUrl = metadata.images[0].url.toString()
    }
    return movie
}

कॉलबैक का इस्तेमाल हो जाने के बाद, हमें उसे MediaManager में रजिस्टर करना होगा. MediaManager.onNewIntent() को कॉल करने से पहले, कॉलबैक को रजिस्टर करना ज़रूरी है. प्लेयर के शुरू होने पर setMediaLoadCommandCallback जोड़ें:

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
        ...
        castReceiverContext = CastReceiverContext.getInstance()
        if (castReceiverContext != null) {
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
            mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
        }
    }
}

सैंपल के तौर पर ऐप्लिकेशन चलाएं

अपने ATV डिवाइस पर ऐप्लिकेशन को डिप्लॉय करने के लिए, Android Studio का &#39;रन&#39; बटन, एक हरे रंग का त्रिभुज, जो दाईं ओर इशारा करता हैचलाएं बटन पर क्लिक करें. जिस व्यक्ति को न्योता भेजा गया है उसके नाम के आगे मौजूद, 'कास्ट करें' बटन कास्ट बटन का आइकॉन पर क्लिक करें और अपना ATV डिवाइस चुनें. ATV ऐप्लिकेशन को ATV डिवाइस पर लॉन्च किया जाएगा. मोबाइल पर कोई वीडियो चुनें. इसके बाद, वीडियो एटीवी पर चलने लगेगा. यह देख लें कि क्या आपको अपने फ़ोन पर, वीडियो चलाने के कंट्रोल की सूचना मिल रही है. ATV डिवाइस पर 'रोकें', 'वीडियो रोकें' जैसे कंट्रोल इस्तेमाल करें.

7. कास्ट कंट्रोल करने के निर्देश देने की सुविधा काम करती है

मौजूदा ऐप्लिकेशन अब उन बेसिक कमांड के साथ काम करता है जो मीडिया सेशन के साथ काम करते हैं. जैसे, चलाना, रोकना, और खोजना. हालांकि, कास्ट कंट्रोल के कुछ ऐसे निर्देश हैं जो मीडिया सेशन में उपलब्ध नहीं हैं. कास्ट कंट्रोल करने के ये निर्देश काम कर सकें, इसके लिए आपको MediaCommandCallback रजिस्टर करना होगा.

प्लेयर के शुरू होने पर setMediaCommandCallback का इस्तेमाल करके, MediaManager इंस्टेंस में MyMediaCommandCallback जोड़ें:

private fun initializePlayer() {
    ...
    castReceiverContext = CastReceiverContext.getInstance()
    if (castReceiverContext != null) {
        val mediaManager = castReceiverContext!!.mediaManager
        ...
        mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
    }
}

तरीके बदलने के लिए, MyMediaCommandCallback क्लास बनाएं. जैसे, onQueueUpdate() कास्ट कंट्रोल करने के निर्देश देने के लिए:

private inner class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onQueueUpdate(
        senderId: String?,
        queueUpdateRequestData: QueueUpdateRequestData
    ): Task<Void> {
        Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
        // Queue Prev / Next
        if (queueUpdateRequestData.getJump() != null) {
            Toast.makeText(
                getActivity(),
                "onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
                Toast.LENGTH_SHORT
            ).show()
        }
        return super.onQueueUpdate(senderId, queueUpdateRequestData)
    }
}

8. मीडिया के स्टेटस के हिसाब से काम करना

मीडिया की स्थिति में बदलाव किया जा रहा है

Cast Connect को मीडिया सेशन से बेस मीडिया स्टेटस मिलता है. बेहतर सुविधाएं देने के लिए, आपका Android TV ऐप्लिकेशन MediaStatusModifier की मदद से अन्य स्टेटस प्रॉपर्टी के बारे में बता सकता है और उन्हें बदल सकता है. MediaStatusModifier, हमेशा उस MediaSession पर काम करेगी जिसे आपने CastReceiverContext में सेट किया है.

उदाहरण के लिए, onLoad कॉलबैक ट्रिगर होने पर, setMediaCommandSupported तय करने के लिए:

import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
    fun onLoad(
        senderId: String?,
        mediaLoadRequestData: MediaLoadRequestData
    ): Task<MediaLoadRequestData> {
        Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
        ...
        return Tasks.call({
            play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
            ...
            // Use MediaStatusModifier to provide additional information for Cast senders.
            mediaManager.getMediaStatusModifier()
                .setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
                .setIsPlayingAd(false)
            mediaManager.broadcastMediaStatus()
            // Return the resolved MediaLoadRequestData to indicate load success.
            mediaLoadRequestData
        })
    }
}

बाहर भेजने से पहले MediaStatus में रुकावट डालना

वेब रिसीवर SDK टूल के MessageInterceptor की तरह ही, अपने MediaStatus में अतिरिक्त बदलाव करने के लिए, MediaManager में MediaStatusWriter तय किया जा सकता है. ऐसा, कनेक्ट किए गए ईमेल पतों पर ब्रॉडकास्ट करने से पहले किया जा सकता है.

उदाहरण के लिए, मोबाइल ईमेल भेजने वालों को मैसेज भेजने से पहले, MediaStatus में कस्टम डेटा सेट किया जा सकता है:

import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...

private fun initializePlayer() {
    if (mPlayer == null) {
        ...
        if (castReceiverContext != null) {
            ...
            val mediaManager: MediaManager = castReceiverContext.getMediaManager()
            ...
            // Use MediaStatusInterceptor to process the MediaStatus before sending out.
            mediaManager.setMediaStatusInterceptor(
                MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
                    try {
                        mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
                    } catch (e: JSONException) {
                        Log.e(LOG_TAG,e.message,e);
                    }
            })
        }
    }
}        

9. बधाई हो

अब आपको Cast Connect लाइब्रेरी का इस्तेमाल करके, Android TV ऐप्लिकेशन को कास्ट करने की सुविधा चालू करने का तरीका पता है.

ज़्यादा जानकारी के लिए डेवलपर गाइड देखें: /cast/docs/android_tv_receiver.