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

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

Google Cast का लोगो

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ऐप्लिकेशन डेवलपमेंट के लिए, Cast Connect की सुविधाएं चालू करने के लिए, आपको Cast Developer Console में, Android TV डिवाइस में पहले से मौजूद उस Chromecast के सीरियल नंबर को रजिस्टर करना होगा जिसका इस्तेमाल आपको करना है. सीरियल नंबर देखने के लिए, अपने 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 इंस्टॉल करें.

mobile-sender.apk इंस्टॉल करने के लिए, adb install कमांड चलाने वाली टर्मिनल विंडो की इमेज

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

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

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

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

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

आइए, ATV ऐप्लिकेशन की मदद से Cast Connect खेलते हैं

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

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

4. स्टार्ट प्रोजेक्ट तैयार करना

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

  1. वेलकम स्क्रीन पर, प्रोजेक्ट इंपोर्ट करें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू विकल्प चुनें.
  2. सैंपल कोड फ़ोल्डर से फ़ोल्डर का आइकॉनapp-start डायरेक्ट्री चुनें और 'ठीक है' पर क्लिक करें.
  3. फ़ाइल > Android Studio में, Gradle बटन की मदद से प्रोजेक्ट सिंक करने की सुविधा प्रोजेक्ट को 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 services के नए वर्शन का इस्तेमाल करता है. इसके लिए, आपके ATV ऐप्लिकेशन को AndroidX नेमस्पेस का इस्तेमाल करने के लिए अपडेट किया जाना ज़रूरी है.

अपने 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)
    ...
}

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

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

7. कास्ट कंट्रोल कमांड की सुविधा

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

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

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

Cast कंट्रोल कमांड के साथ काम करने के लिए, 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 की तरह ही, MediaManager में MediaStatusWriter तय किया जा सकता है. इससे, कनेक्ट किए गए भेजने वालों को ब्रॉडकास्ट करने से पहले, MediaStatus में और बदलाव किए जा सकते हैं.

उदाहरण के लिए, मोबाइल ईमेल भेजने वालों को मैसेज भेजने से पहले, 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.