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

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

Google Cast का लोगो

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

रजिस्टर किए बिना, 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. अपने Android TV डिवाइस से ADB कनेक्ट करें. इसके बाद, डिवाइस 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 TV डिवाइस दिखाने वाला Android Studio टूलबार

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

ऐप डिज़ाइन

ऐप्लिकेशन में, उपयोगकर्ताओं को वीडियो की सूची मिलती है, ताकि वे उन्हें ब्राउज़ कर सकें. उपयोगकर्ता, 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 एक सिंगलटन ऑब्जेक्ट है, जो Cast के सभी इंटरैक्शन को कोऑर्डिनेट करता है. 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.