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

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

Google Cast का लोगो

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

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

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

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

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

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

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

आप इन चीज़ों के बारे में जानेंगे

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

आपको इनकी ज़रूरत होगी

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

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

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

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

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

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

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

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

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 इंस्टॉल करें.

एक टर्मिनल विंडो की इमेज, जिसमें मोबाइल-sender.apk इंस्टॉल करने के लिए adb install निर्देश दिया गया है

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

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

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

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

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

आइए, ATV ऐप्लिकेशन की मदद से Cast Connect को चलाएं

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

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

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

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

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

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

ऐप डिज़ाइन

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

MainActivity

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

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

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

PlaybackActivity

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

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

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

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

5. Cast सहायता को कॉन्फ़िगर करना

डिपेंडेंसी

ज़रूरी लाइब्रेरी डिपेंडेंसी शामिल करने के लिए, ऐप्लिकेशन 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>

अपने Cast भेजने वाले के ज़रिए 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 बंद करना चाहिए. हमारा सुझाव है कि CastReceiverContext.start() और CastReceiverContext.stop() को कॉल करने की सुविधा को मैनेज करने के लिए, androidx.lifecycle लाइब्रेरी से LifecycleObserver का इस्तेमाल करें

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

आइए, सैंपल ऐप्लिकेशन चलाएं

अपने एटीवी डिवाइस पर ऐप्लिकेशन को डिप्लॉय करने के लिए, Android Studio का रन बटन, जो दाईं ओर इशारा करता है और हरे रंग का त्रिभुज हैरन बटन पर क्लिक करें. इसके बाद, ऐप्लिकेशन को बंद करें और एटीवी की होम स्क्रीन पर वापस जाएं. भेजने वाले व्यक्ति के मैसेज से, कास्ट बटन &#39;कास्ट करें&#39; बटन का आइकॉन पर क्लिक करें और अपना 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())
        }
    }
}

आइए, सैंपल ऐप्लिकेशन चलाएं

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

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

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

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

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

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

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.