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

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

Google Cast का लोगो

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

Google Cast क्या है?

Google Cast की मदद से, लोग अपने फ़ोन या टैबलेट पर मौजूद कॉन्टेंट को टीवी पर कास्ट कर सकते हैं. इसके बाद, उपयोगकर्ता अपने मोबाइल डिवाइस का इस्तेमाल, टीवी पर मीडिया चलाने के लिए रिमोट कंट्रोल के तौर पर कर सकते हैं.

Google Cast SDK की मदद से, अपने ऐप्लिकेशन को टीवी या साउंड सिस्टम को कंट्रोल करने के लिए इस्तेमाल किया जा सकता है. Cast SDK की मदद से, Google Cast की डिज़ाइन चेकलिस्ट के आधार पर, ज़रूरी यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट जोड़े जा सकते हैं.

Google Cast की डिज़ाइन चेकलिस्ट इसलिए दी गई है, ताकि Cast की सुविधा इस्तेमाल करने वाले लोगों को सभी प्लैटफ़ॉर्म पर एक जैसा और आसान अनुभव मिल सके.

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

इस कोडलैब को पूरा करने के बाद, आपके पास एक Android वीडियो ऐप्लिकेशन होगा. यह ऐप्लिकेशन, Google Cast की सुविधा वाले डिवाइस पर वीडियो कास्ट कर सकेगा.

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

  • किसी सैंपल वीडियो ऐप्लिकेशन में Google Cast SDK जोड़ने का तरीका.
  • Google Cast डिवाइस चुनने के लिए, कास्ट बटन जोड़ने का तरीका.
  • कास्ट डिवाइस से कनेक्ट करने और मीडिया रिसीवर लॉन्च करने का तरीका.
  • वीडियो कास्ट करने का तरीका.
  • अपने ऐप्लिकेशन में कास्ट मिनी कंट्रोलर जोड़ने का तरीका.
  • मीडिया सूचनाओं और लॉक स्क्रीन कंट्रोल की सुविधा कैसे काम करती है.
  • बड़ा किया गया कंट्रोलर जोड़ने का तरीका.
  • इंट्रोडक्ट्री ओवरले जोड़ने का तरीका.
  • कास्ट करने की सुविधा वाले विजेट को पसंद के मुताबिक बनाने का तरीका.
  • Cast Connect के साथ इंटिग्रेट करने का तरीका

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

  • Android SDK का नया वर्शन.
  • Android Studio का 3.2 या इसके बाद का वर्शन
  • Android 4.1+ Jelly Bean (एपीआई लेवल 16) वाला एक मोबाइल डिवाइस.
  • अपने मोबाइल डिवाइस को डेवलपमेंट कंप्यूटर से कनेक्ट करने के लिए, यूएसबी डेटा केबल.
  • Google Cast की सुविधा वाला कोई डिवाइस, जैसे कि Chromecast या Android TV. इस डिवाइस में इंटरनेट ऐक्सेस की सुविधा कॉन्फ़िगर की गई हो.
  • एचडीएमआई इनपुट वाला टीवी या मॉनिटर.
  • Cast Connect इंटिग्रेशन की जांच करने के लिए, Chromecast with Google TV की ज़रूरत होती है. हालांकि, Codelab के बाकी हिस्सों के लिए इसकी ज़रूरत नहीं होती. अगर आपके पास ऐसा कोई डिवाइस नहीं है, तो इस ट्यूटोरियल के आखिर में दिए गए कास्ट कनेक्ट की सुविधा जोड़ें चरण को छोड़ दें.

अनुभव

  • इसके लिए, आपको Kotlin और Android डेवलपमेंट के बारे में पहले से जानकारी होनी चाहिए.
  • आपको टीवी देखने का तरीका भी पता होना चाहिए :)

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और एक्सरसाइज़ पूरी करें

Android ऐप्लिकेशन बनाने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

टीवी देखने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

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

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

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

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

कंपास के आइकॉन की इमेज

सबसे पहले, आइए देखते हैं कि पूरा किया गया सैंपल ऐप्लिकेशन कैसा दिखता है. यह ऐप्लिकेशन, बुनियादी वीडियो प्लेयर है. उपयोगकर्ता, सूची से कोई वीडियो चुन सकता है. इसके बाद, वह वीडियो को डिवाइस पर चला सकता है या उसे Google Cast डिवाइस पर कास्ट कर सकता है.

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

वेलकम स्क्रीन पर मौजूद प्रोजेक्ट इंपोर्ट करें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू के विकल्प चुनें.

सैंपल कोड फ़ोल्डर से फ़ोल्डर का आइकॉनapp-done डायरेक्ट्री चुनें और ठीक है पर क्लिक करें.

File > Android Studio में 'Gradle के साथ प्रोजेक्ट सिंक करें' बटन Sync Project with Gradle Files पर क्लिक करें.

अपने Android डिवाइस पर यूएसबी डीबगिंग चालू करें – Android 4.2 और इसके बाद के वर्शन में, डेवलपर के लिए उपलब्ध सेटिंग और टूल वाली स्क्रीन डिफ़ॉल्ट रूप से छिपी होती है. इसे दिखाने के लिए, सेटिंग > फ़ोन के बारे में जानकारी पर जाएं और बिल्ड नंबर पर सात बार टैप करें. पिछली स्क्रीन पर वापस जाएं. इसके बाद, सिस्टम > ऐडवांस सेटिंग पर जाएं. अब सबसे नीचे मौजूद, डेवलपर के लिए सेटिंग और टूल पर टैप करें. इसके बाद, यूएसबी डीबग करना पर टैप करके इसे चालू करें.

अपने Android डिवाइस को प्लग इन करें और Android Studio में Android Studio का 'चलाएं' बटन, दाईं ओर इशारा करता हुआ हरे रंग का त्रिभुजचलाएं बटन पर क्लिक करें. कुछ सेकंड बाद, आपको Cast Videos नाम का वीडियो ऐप्लिकेशन दिखेगा.

वीडियो ऐप्लिकेशन में मौजूद कास्ट बटन पर क्लिक करें. इसके बाद, Google Cast की सुविधा वाला डिवाइस चुनें.

कोई वीडियो चुनें और 'चलाएं' बटन पर क्लिक करें.

वीडियो, आपके Google Cast डिवाइस पर चलने लगेगा.

आपको बड़ा किया गया कंट्रोलर दिखेगा. वीडियो चलाने या रोकने के लिए, 'चलाएं/रोकें' बटन का इस्तेमाल किया जा सकता है.

वीडियो की सूची पर वापस जाएं.

अब स्क्रीन पर सबसे नीचे एक मिनी कंट्रोलर दिख रहा है. Android फ़ोन पर 'वीडियो कास्ट करें' ऐप्लिकेशन का इलस्ट्रेशन दिखाया गया है. इसमें स्क्रीन के सबसे नीचे तीन मिनी कंट्रोलर दिख रहे हैं

वीडियो को रिसीवर पर रोकने के लिए, मिनी कंट्रोलर में मौजूद 'रोकें' बटन पर क्लिक करें. वीडियो को फिर से चलाने के लिए, मिनी कंट्रोलर में मौजूद 'चलाएं' बटन पर क्लिक करें.

मोबाइल डिवाइस के होम बटन पर क्लिक करें. सूचनाएं नीचे की ओर खींचें. अब आपको कास्ट सेशन की सूचना दिखेगी.

अपने फ़ोन को लॉक करें. इसके बाद, उसे अनलॉक करने पर आपको लॉक स्क्रीन पर एक सूचना दिखेगी. इससे मीडिया के प्लेबैक को कंट्रोल किया जा सकता है या कास्टिंग को रोका जा सकता है.

वीडियो ऐप्लिकेशन पर वापस जाएं और Google Cast डिवाइस पर कास्ट करना बंद करने के लिए, कास्ट करें बटन पर क्लिक करें.

अक्सर पूछे जाने वाले सवाल

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

'Cast Videos' ऐप्लिकेशन चलाने वाले Android फ़ोन का इलस्ट्रेशन

हमने जो ऐप्लिकेशन डाउनलोड किया है उसमें Google Cast की सुविधा जोड़ने की ज़रूरत है. यहां Google Cast से जुड़े कुछ ऐसे शब्दों के बारे में बताया गया है जिनका इस्तेमाल हम इस कोडलैब में करेंगे:

  • सेंडर ऐप्लिकेशन, मोबाइल डिवाइस या लैपटॉप पर चलता है,
  • Google Cast डिवाइस पर रिसीवर ऐप्लिकेशन चलता है.

अब Android Studio का इस्तेमाल करके, स्टार्टर प्रोजेक्ट पर काम किया जा सकता है:

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

ऐप डिज़ाइन

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

ऐप्लिकेशन में दो मुख्य गतिविधियां शामिल हैं: VideoBrowserActivity और LocalPlayerActivity. Google Cast की सुविधा को इंटिग्रेट करने के लिए, गतिविधियों को AppCompatActivity या इसके पैरंट FragmentActivity से इनहेरिट करना होगा. यह सीमा इसलिए है, क्योंकि हमें MediaRouteButton को MediaRouteActionProvider के तौर पर जोड़ना होगा. यह MediaRouter support library में उपलब्ध है. यह सिर्फ़ तब काम करेगा, जब ऐक्टिविटी ऊपर बताई गई क्लास से इनहेरिट हो रही हो. MediaRouter support library, AppCompat support library पर निर्भर करती है. यह लाइब्रेरी, ज़रूरी क्लास उपलब्ध कराती है.

VideoBrowserActivity

इस गतिविधि में एक Fragment (VideoBrowserFragment) शामिल है. इस सूची को ArrayAdapter (VideoListAdapter) से बैक अप लिया जाता है. वीडियो की सूची और उनसे जुड़ा मेटाडेटा, रिमोट सर्वर पर JSON फ़ाइल के तौर पर होस्ट किया जाता है. AsyncTaskLoader (VideoItemLoader) इस JSON को फ़ेच करता है और इसे प्रोसेस करके, MediaItem ऑब्जेक्ट की सूची बनाता है.

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

जब लोडर, MediaItems की सूची बनाता है, तो वह उस सूची को VideoListAdapter को पास करता है. इसके बाद, VideoListAdapter, MediaItems की सूची को VideoBrowserFragment में दिखाता है. उपयोगकर्ता को वीडियो के थंबनेल की सूची दिखाई जाती है. साथ ही, हर वीडियो के बारे में कम शब्दों में जानकारी दी जाती है. किसी आइटम को चुनने पर, उससे जुड़ा MediaItem, Bundle में बदल जाता है और LocalPlayerActivity को पास कर दिया जाता है.

LocalPlayerActivity

इस गतिविधि में, किसी वीडियो के बारे में मेटाडेटा दिखता है. साथ ही, उपयोगकर्ता को मोबाइल डिवाइस पर वीडियो को स्थानीय तौर पर चलाने की अनुमति मिलती है.

इस गतिविधि में VideoView, मीडिया कंट्रोल, और चुने गए वीडियो का ब्यौरा दिखाने के लिए टेक्स्ट एरिया होता है. प्लेयर, स्क्रीन के ऊपरी हिस्से को कवर करता है. इससे वीडियो के बारे में ज़्यादा जानकारी देने के लिए, स्क्रीन के निचले हिस्से में जगह मिल जाती है. उपयोगकर्ता, वीडियो को चला/रोक सकता है या वीडियो को आगे-पीछे कर सकता है.

डिपेंडेंसी

AppCompatActivity का इस्तेमाल करने के लिए, हमें AppCompat सपोर्ट लाइब्रेरी की ज़रूरत होती है. वीडियो की सूची को मैनेज करने और सूची के लिए इमेज को एसिंक्रोनस तरीके से पाने के लिए, हम Volley लाइब्रेरी का इस्तेमाल कर रहे हैं.

अक्सर पूछे जाने वाले सवाल

5. 'कास्ट करें' बटन जोड़ना

Android फ़ोन के ऊपरी हिस्से का इलस्ट्रेशन, जिसमें Cast Video ऐप्लिकेशन चल रहा है. साथ ही, स्क्रीन के सबसे ऊपर दाएं कोने में कास्ट बटन दिख रहा है

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

डिपेंडेंसी

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

dependencies {
    implementation 'androidx.appcompat:appcompat:1.5.0'
    implementation 'androidx.mediarouter:mediarouter:1.3.1'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'com.google.android.gms:play-services-cast-framework:21.1.0'
    implementation 'com.android.volley:volley:1.2.1'
    implementation "androidx.core:core-ktx:1.8.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

प्रोजेक्ट को सिंक करें, ताकि यह पुष्टि की जा सके कि प्रोजेक्ट में कोई गड़बड़ी नहीं है.

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

Cast फ़्रेमवर्क में एक ग्लोबल सिंगलटन ऑब्जेक्ट होता है, जिसे CastContext कहा जाता है. यह Cast के सभी इंटरैक्शन को मैनेज करता है.

CastContext सिंगलटन को शुरू करने के लिए ज़रूरी CastOptions उपलब्ध कराने के लिए, आपको OptionsProvider इंटरफ़ेस लागू करना होगा. सबसे ज़रूरी विकल्प, रिसीवर ऐप्लिकेशन आईडी होता है. इसका इस्तेमाल, कास्ट करने के लिए उपलब्ध डिवाइसों को खोजने के नतीजों को फ़िल्टर करने के लिए किया जाता है. साथ ही, कास्ट सेशन शुरू होने पर रिसीवर ऐप्लिकेशन लॉन्च करने के लिए भी इसका इस्तेमाल किया जाता है.

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

प्रोजेक्ट के com.google.sample.cast.refplayer पैकेज में, यह नई CastOptionsProvider.kt फ़ाइल जोड़ें:

package com.google.sample.cast.refplayer

import android.content.Context
import com.google.android.gms.cast.framework.OptionsProvider
import com.google.android.gms.cast.framework.CastOptions
import com.google.android.gms.cast.framework.SessionProvider

class CastOptionsProvider : OptionsProvider {
    override fun getCastOptions(context: Context): CastOptions {
        return CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .build()
    }

    override fun getAdditionalSessionProviders(context: Context): List<SessionProvider>? {
        return null
    }
}

अब ऐप्लिकेशन की AndroidManifest.xml फ़ाइल के "application" टैग में, OptionsProvider का एलान करें:

<meta-data
    android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />

VideoBrowserActivity onCreate तरीके में, CastContext को लेज़ी तरीके से शुरू करें:

import com.google.android.gms.cast.framework.CastContext

private var mCastContext: CastContext? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.video_browser)
    setupActionBar()

    mCastContext = CastContext.getSharedInstance(this)
}

LocalPlayerActivity में भी वही लॉजिक जोड़ें.

कास्ट बटन

CastContext को शुरू करने के बाद, हमें कास्ट करने का बटन जोड़ना होगा, ताकि उपयोगकर्ता कास्ट करने के लिए कोई डिवाइस चुन सके. कास्ट बटन को MediaRouter सपोर्ट लाइब्रेरी से MediaRouteButton लागू करता है. किसी भी ऐक्शन आइकॉन की तरह, इस आइकॉन को भी अपनी गतिविधि में जोड़ा जा सकता है. इसके लिए, ActionBar या Toolbar का इस्तेमाल करें. हालांकि, इससे पहले आपको मेन्यू में उससे जुड़ा मेन्यू आइटम जोड़ना होगा.

res/menu/browse.xml फ़ाइल में बदलाव करें और सेटिंग आइटम से पहले मेन्यू में MediaRouteActionProvider आइटम जोड़ें:

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"
    app:showAsAction="always"/>

MediaRouteButton को Cast फ़्रेमवर्क से जोड़ने के लिए, CastButtonFactory का इस्तेमाल करके VideoBrowserActivity के onCreateOptionsMenu() तरीके को बदलें:

import com.google.android.gms.cast.framework.CastButtonFactory

private var mediaRouteMenuItem: MenuItem? = null

override fun onCreateOptionsMenu(menu: Menu): Boolean {
     super.onCreateOptionsMenu(menu)
     menuInflater.inflate(R.menu.browse, menu)
     mediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu,
                R.id.media_route_menu_item)
     return true
}

इसी तरह, LocalPlayerActivity में मौजूद onCreateOptionsMenu एट्रिब्यूट की वैल्यू को बदलें.

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

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

6. वीडियो कॉन्टेंट कास्ट करना

&#39;Cast Videos&#39; ऐप्लिकेशन चलाने वाले Android फ़ोन का इलस्ट्रेशन

हम सैंपल ऐप्लिकेशन को इस तरह से अपडेट करेंगे कि वह Cast डिवाइस पर वीडियो को रिमोट से भी चला सके. इसके लिए, हमें Cast फ़्रेमवर्क से जनरेट होने वाले अलग-अलग इवेंट सुनने होंगे.

मीडिया कास्ट करना

अगर आपको किसी कास्ट डिवाइस पर मीडिया चलाना है, तो आपको ये काम करने होंगे:

  1. मीडिया आइटम को मॉडल करने वाला MediaInfo ऑब्जेक्ट बनाएं.
  2. कास्ट डिवाइस से कनेक्ट करें और रिसीवर ऐप्लिकेशन लॉन्च करें.
  3. MediaInfo ऑब्जेक्ट को अपने रिसीवर में लोड करें और कॉन्टेंट चलाएं.
  4. मीडिया के स्टेटस को ट्रैक करता है.
  5. उपयोगकर्ता के इंटरैक्शन के आधार पर, रिसीवर को वीडियो चलाने के निर्देश भेजें.

हम पिछले सेक्शन में, दूसरे चरण को पहले ही पूरा कर चुके हैं. कास्ट फ़्रेमवर्क की मदद से, तीसरा चरण आसानी से पूरा किया जा सकता है. पहले चरण में, एक ऑब्जेक्ट को दूसरे ऑब्जेक्ट से मैप किया जाता है. MediaInfo वह ऑब्जेक्ट है जिसे Cast फ़्रेमवर्क समझता है और MediaItem, मीडिया आइटम के लिए हमारे ऐप्लिकेशन का एनकैप्सुलेशन है. हम MediaItem को MediaInfo से आसानी से मैप कर सकते हैं.

सैंपल ऐप्लिकेशन LocalPlayerActivity, इस enum का इस्तेमाल करके पहले से ही लोकल और रिमोट प्लेबैक के बीच अंतर करता है:

private var mLocation: PlaybackLocation? = null

enum class PlaybackLocation {
    LOCAL, REMOTE
}

enum class PlaybackState {
    PLAYING, PAUSED, BUFFERING, IDLE
}

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

फ़िलहाल, लोकल प्लेयर हमेशा लोकल प्लेबैक की स्थिति में होता है, क्योंकि इसे कास्टिंग की स्थितियों के बारे में कोई जानकारी नहीं होती. हमें Cast फ़्रेमवर्क में होने वाले स्टेट ट्रांज़िशन के आधार पर, यूज़र इंटरफ़ेस (यूआई) को अपडेट करना होगा. उदाहरण के लिए, अगर हम कास्टिंग शुरू करते हैं, तो हमें लोकल प्लेबैक को रोकना होगा और कुछ कंट्रोल को बंद करना होगा. इसी तरह, अगर इस गतिविधि के दौरान कास्टिंग बंद कर दी जाती है, तो हमें लोकल प्लेबैक पर स्विच करना होगा. इसके लिए, हमें Cast फ़्रेमवर्क से जनरेट होने वाले अलग-अलग इवेंट को सुनना होगा.

कास्ट सेशन का मैनेजमेंट

Cast फ़्रेमवर्क के लिए, Cast सेशन में ये चरण शामिल होते हैं: किसी डिवाइस से कनेक्ट करना, लॉन्च करना (या शामिल होना), रिसीवर ऐप्लिकेशन से कनेक्ट करना, और अगर ज़रूरी हो, तो मीडिया कंट्रोल चैनल शुरू करना. मीडिया कंट्रोल चैनल की मदद से, Cast फ़्रेमवर्क, रिसीवर मीडिया प्लेयर से मैसेज भेजता और पाता है.

जब उपयोगकर्ता, कास्ट करने के बटन से कोई डिवाइस चुनता है, तो कास्टिंग सेशन अपने-आप शुरू हो जाएगा. साथ ही, जब उपयोगकर्ता डिसकनेक्ट करता है, तो यह अपने-आप बंद हो जाएगा. नेटवर्क से जुड़ी समस्याओं की वजह से, Cast SDK रिसीवर सेशन से फिर से कनेक्ट होने की प्रोसेस को भी अपने-आप मैनेज करता है.

आइए, LocalPlayerActivity में SessionManagerListener जोड़ें:

import com.google.android.gms.cast.framework.CastSession
import com.google.android.gms.cast.framework.SessionManagerListener
...

private var mSessionManagerListener: SessionManagerListener<CastSession>? = null
private var mCastSession: CastSession? = null
...

private fun setupCastListener() {
    mSessionManagerListener = object : SessionManagerListener<CastSession> {
        override fun onSessionEnded(session: CastSession, error: Int) {
            onApplicationDisconnected()
        }

        override fun onSessionResumed(session: CastSession, wasSuspended: Boolean) {
            onApplicationConnected(session)
        }

        override fun onSessionResumeFailed(session: CastSession, error: Int) {
            onApplicationDisconnected()
        }

        override fun onSessionStarted(session: CastSession, sessionId: String) {
            onApplicationConnected(session)
        }

        override fun onSessionStartFailed(session: CastSession, error: Int) {
            onApplicationDisconnected()
        }

        override fun onSessionStarting(session: CastSession) {}
        override fun onSessionEnding(session: CastSession) {}
        override fun onSessionResuming(session: CastSession, sessionId: String) {}
        override fun onSessionSuspended(session: CastSession, reason: Int) {}
        private fun onApplicationConnected(castSession: CastSession) {
            mCastSession = castSession
            if (null != mSelectedMedia) {
                if (mPlaybackState == PlaybackState.PLAYING) {
                    mVideoView!!.pause()
                    loadRemoteMedia(mSeekbar!!.progress, true)
                    return
                } else {
                    mPlaybackState = PlaybackState.IDLE
                    updatePlaybackLocation(PlaybackLocation.REMOTE)
                }
            }
            updatePlayButton(mPlaybackState)
            invalidateOptionsMenu()
        }

        private fun onApplicationDisconnected() {
            updatePlaybackLocation(PlaybackLocation.LOCAL)
            mPlaybackState = PlaybackState.IDLE
            mLocation = PlaybackLocation.LOCAL
            updatePlayButton(mPlaybackState)
            invalidateOptionsMenu()
       }
   }
}

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

फ़िलहाल, चालू सेशन को SessionManager.getCurrentSession() के तौर पर ऐक्सेस किया जा सकता है. उपयोगकर्ता के कास्ट डायलॉग के साथ इंटरैक्शन करने पर, सेशन अपने-आप बन जाते हैं और बंद हो जाते हैं.

हमें अपने सेशन लिसनर को रजिस्टर करना होगा और कुछ ऐसे वैरिएबल को शुरू करना होगा जिनका इस्तेमाल हम गतिविधि में करेंगे. LocalPlayerActivity onCreate के तरीके को इसमें बदलें:

import com.google.android.gms.cast.framework.CastContext
...

private var mCastContext: CastContext? = null
...

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    mCastContext = CastContext.getSharedInstance(this)
    mCastSession = mCastContext!!.sessionManager.currentCastSession
    setupCastListener()
    ...
    loadViews()
    ...
    val bundle = intent.extras
    if (bundle != null) {
        ....
        if (shouldStartPlayback) {
              ....

        } else {
            if (mCastSession != null && mCastSession!!.isConnected()) {
                updatePlaybackLocation(PlaybackLocation.REMOTE)
            } else {
                updatePlaybackLocation(PlaybackLocation.LOCAL)
            }
            mPlaybackState = PlaybackState.IDLE
            updatePlayButton(mPlaybackState)
        }
    }
    ...
}

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

Cast SDK में, RemoteMediaClient, रिसीवर डिवाइस पर रिमोट मीडिया प्लेबैक को मैनेज करने के लिए, एपीआई का एक सेट उपलब्ध कराता है. मीडिया चलाने की सुविधा देने वाले CastSession के लिए, एसडीके RemoteMediaClient का इंस्टेंस अपने-आप बना देगा. इसे CastSession इंस्टेंस पर getRemoteMediaClient() तरीके को कॉल करके ऐक्सेस किया जा सकता है. LocalPlayerActivity में ये तरीके जोड़ें, ताकि रिसीवर पर मौजूदा वीडियो लोड किया जा सके:

import com.google.android.gms.cast.framework.media.RemoteMediaClient
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaLoadOptions
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.common.images.WebImage
import com.google.android.gms.cast.MediaLoadRequestData

private fun loadRemoteMedia(position: Int, autoPlay: Boolean) {
    if (mCastSession == null) {
        return
    }
    val remoteMediaClient = mCastSession!!.remoteMediaClient ?: return
    remoteMediaClient.load( MediaLoadRequestData.Builder()
                .setMediaInfo(buildMediaInfo())
                .setAutoplay(autoPlay)
                .setCurrentTime(position.toLong()).build())
}

private fun buildMediaInfo(): MediaInfo? {
    val movieMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
    mSelectedMedia?.studio?.let { movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, it) }
    mSelectedMedia?.title?.let { movieMetadata.putString(MediaMetadata.KEY_TITLE, it) }
    movieMetadata.addImage(WebImage(Uri.parse(mSelectedMedia!!.getImage(0))))
    movieMetadata.addImage(WebImage(Uri.parse(mSelectedMedia!!.getImage(1))))
    return mSelectedMedia!!.url?.let {
        MediaInfo.Builder(it)
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setContentType("videos/mp4")
            .setMetadata(movieMetadata)
            .setStreamDuration((mSelectedMedia!!.duration * 1000).toLong())
            .build()
    }
}

अब रिमोट प्लेबैक की सुविधा के लिए, कास्ट सेशन के लॉजिक का इस्तेमाल करने के लिए, मौजूदा तरीकों को अपडेट करें:

private fun play(position: Int) {
    startControllersTimer()
    when (mLocation) {
        PlaybackLocation.LOCAL -> {
            mVideoView!!.seekTo(position)
            mVideoView!!.start()
        }
        PlaybackLocation.REMOTE -> {
            mPlaybackState = PlaybackState.BUFFERING
            updatePlayButton(mPlaybackState)
            //seek to a new position within the current media item's new position 
            //which is in milliseconds from the beginning of the stream
            mCastSession!!.remoteMediaClient?.seek(position.toLong())
        }
        else -> {}
    }
    restartTrickplayTimer()
}
private fun togglePlayback() {
    ...
    PlaybackState.IDLE -> when (mLocation) {
        ...
        PlaybackLocation.REMOTE -> {
            if (mCastSession != null && mCastSession!!.isConnected) {
                loadRemoteMedia(mSeekbar!!.progress, true)
            }
        }
        else -> {}
    }
    ...
}
override fun onPause() {
    ...
    mCastContext!!.sessionManager.removeSessionManagerListener(
                mSessionManagerListener!!, CastSession::class.java)
}
override fun onResume() {
    Log.d(TAG, "onResume() was called")
    mCastContext!!.sessionManager.addSessionManagerListener(
            mSessionManagerListener!!, CastSession::class.java)
    if (mCastSession != null && mCastSession!!.isConnected) {
        updatePlaybackLocation(PlaybackLocation.REMOTE)
    } else {
        updatePlaybackLocation(PlaybackLocation.LOCAL)
    }
    super.onResume()
}

updatePlayButton तरीके के लिए, isConnected वैरिएबल की वैल्यू बदलें:

private fun updatePlayButton(state: PlaybackState?) {
    ...
    val isConnected = (mCastSession != null
                && (mCastSession!!.isConnected || mCastSession!!.isConnecting))
    ...
}

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

7. मिनी कंट्रोलर

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

Android फ़ोन के निचले हिस्से की इमेज. इसमें Cast Videos ऐप्लिकेशन में मिनी प्लेयर दिखाया गया है

Cast SDK, कस्टम व्यू MiniControllerFragment उपलब्ध कराता है. इसे उन ऐक्टिविटी की ऐप्लिकेशन लेआउट फ़ाइल में जोड़ा जा सकता है जिनमें आपको मिनी कंट्रोलर दिखाना है.

res/layout/player_activity.xml और res/layout/video_browser.xml, दोनों के सबसे नीचे फ़्रैगमेंट की यह परिभाषा जोड़ें:

<fragment
    android:id="@+id/castMiniController"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:visibility="gone"
    class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment"/>

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

8. सूचना और लॉक स्क्रीन

Google Cast के डिज़ाइन की चेकलिस्ट के मुताबिक, सेंडर ऐप्लिकेशन को सूचना और लॉक स्क्रीन से मीडिया कंट्रोल लागू करने होते हैं.

Android फ़ोन के इलस्ट्रेशन में, सूचनाओं वाले सेक्शन में मीडिया कंट्रोलर दिखाया गया है

Cast SDK, MediaNotificationService उपलब्ध कराता है. इससे सेंडर ऐप्लिकेशन को सूचना और लॉक स्क्रीन के लिए मीडिया कंट्रोल बनाने में मदद मिलती है. यह सेवा, Gradle की मदद से आपके ऐप्लिकेशन के मेनिफ़ेस्ट में अपने-आप मर्ज हो जाती है.

जब भेजने वाला डिवाइस कॉन्टेंट कास्ट कर रहा होगा, तब MediaNotificationService बैकग्राउंड में चलेगा. साथ ही, यह एक सूचना दिखाएगा. इसमें मौजूदा कास्टिंग आइटम के बारे में इमेज थंबनेल और मेटाडेटा, चलाने/रोकने का बटन, और रोकने का बटन होगा.

CastContext को शुरू करते समय, CastOptions की मदद से सूचना और लॉक स्क्रीन कंट्रोल की सुविधा चालू की जा सकती है. सूचना और लॉक स्क्रीन के लिए मीडिया कंट्रोल की सुविधा डिफ़ॉल्ट रूप से चालू होती है. सूचना पाने की सुविधा चालू रहने तक, लॉक स्क्रीन की सुविधा चालू रहती है.

CastOptionsProvider में बदलाव करें और getCastOptions को इस कोड से मैच करने के लिए बदलें:

import com.google.android.gms.cast.framework.media.CastMediaOptions
import com.google.android.gms.cast.framework.media.NotificationOptions

override fun getCastOptions(context: Context): CastOptions {
   val notificationOptions = NotificationOptions.Builder()
            .setTargetActivityClassName(VideoBrowserActivity::class.java.name)
            .build()
    val mediaOptions = CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .build()
   return CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .setCastMediaOptions(mediaOptions)
                .build()
}

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

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

9. सामान्य जानकारी देने वाला ओवरले

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

Cast Videos Android ऐप्लिकेशन में, कास्ट बटन के आस-पास कास्ट ओवरले दिखाने वाली इमेज

Cast SDK, कस्टम व्यू IntroductoryOverlay उपलब्ध कराता है. इसका इस्तेमाल, Cast बटन को पहली बार उपयोगकर्ताओं को दिखाए जाने पर उसे हाइलाइट करने के लिए किया जा सकता है. VideoBrowserActivity में यह कोड जोड़ें:

import com.google.android.gms.cast.framework.IntroductoryOverlay
import android.os.Looper

private var mIntroductoryOverlay: IntroductoryOverlay? = null

private fun showIntroductoryOverlay() {
    mIntroductoryOverlay?.remove()
    if (mediaRouteMenuItem?.isVisible == true) {
       Looper.myLooper().run {
           mIntroductoryOverlay = com.google.android.gms.cast.framework.IntroductoryOverlay.Builder(
                    this@VideoBrowserActivity, mediaRouteMenuItem!!)
                   .setTitleText("Introducing Cast")
                   .setSingleTime()
                   .setOnOverlayDismissedListener(
                           object : IntroductoryOverlay.OnOverlayDismissedListener {
                               override fun onOverlayDismissed() {
                                   mIntroductoryOverlay = null
                               }
                          })
                   .build()
          mIntroductoryOverlay!!.show()
        }
    }
}

अब, CastStateListener जोड़ें और जब कोई Cast डिवाइस उपलब्ध हो, तब showIntroductoryOverlay तरीके को कॉल करें. इसके लिए, onCreate तरीके में बदलाव करें. साथ ही, onResume और onPause तरीकों को इस तरह से बदलें:

import com.google.android.gms.cast.framework.CastState
import com.google.android.gms.cast.framework.CastStateListener

private var mCastStateListener: CastStateListener? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.video_browser)
    setupActionBar()
    mCastStateListener = object : CastStateListener {
            override fun onCastStateChanged(newState: Int) {
                if (newState != CastState.NO_DEVICES_AVAILABLE) {
                    showIntroductoryOverlay()
                }
            }
        }
    mCastContext = CastContext.getSharedInstance(this)
}

override fun onResume() {
    super.onResume()
    mCastContext?.addCastStateListener(mCastStateListener!!)
}

override fun onPause() {
    super.onPause()
    mCastContext?.removeCastStateListener(mCastStateListener!!)
}

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

10. बड़ा किया गया कंट्रोलर

Google Cast डिज़ाइन चेकलिस्ट के मुताबिक, सेंडर ऐप्लिकेशन को कास्ट किए जा रहे मीडिया के लिए बड़ा किया गया कंट्रोलर उपलब्ध कराना होगा. बड़ा किया गया कंट्रोलर, मिनी कंट्रोलर का फ़ुल स्क्रीन वर्शन होता है.

Android फ़ोन पर वीडियो चलने की इमेज. इसमें कंट्रोलर को बड़ा करके दिखाया गया है

Cast SDK, बड़े किए गए कंट्रोलर के लिए एक विजेट उपलब्ध कराता है. इसे ExpandedControllerActivity कहा जाता है. यह एक ऐब्स्ट्रैक्ट क्लास है. आपको कास्ट बटन जोड़ने के लिए, इसे सबक्लास करना होगा.

सबसे पहले, Cast बटन उपलब्ध कराने के लिए, expanded_controller.xml नाम की नई मेन्यू रिसॉर्स फ़ाइल बनाएं. यह फ़ाइल, बड़े किए गए कंट्रोलर के लिए होगी:

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
            android:id="@+id/media_route_menu_item"
            android:title="@string/media_route_menu_title"
            app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"
            app:showAsAction="always"/>

</menu>

com.google.sample.cast.refplayer पैकेज में एक नया पैकेज expandedcontrols बनाएं. इसके बाद, com.google.sample.cast.refplayer.expandedcontrols पैकेज में ExpandedControlsActivity.kt नाम की एक नई फ़ाइल बनाएं.

package com.google.sample.cast.refplayer.expandedcontrols

import android.view.Menu
import com.google.android.gms.cast.framework.media.widget.ExpandedControllerActivity
import com.google.sample.cast.refplayer.R
import com.google.android.gms.cast.framework.CastButtonFactory

class ExpandedControlsActivity : ExpandedControllerActivity() {
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        super.onCreateOptionsMenu(menu)
        menuInflater.inflate(R.menu.expanded_controller, menu)
        CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.media_route_menu_item)
        return true
    }
}

अब OPTIONS_PROVIDER_CLASS_NAME के ऊपर मौजूद application टैग में, AndroidManifest.xml के अंदर ExpandedControlsActivity का एलान करें:

<application>
    ...
    <activity
        android:name="com.google.sample.cast.refplayer.expandedcontrols.ExpandedControlsActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:theme="@style/Theme.CastVideosDark"
        android:screenOrientation="portrait"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
        </intent-filter>
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.google.sample.cast.refplayer.VideoBrowserActivity"/>
    </activity>
    ...
</application>

CastOptionsProvider में बदलाव करें. साथ ही, NotificationOptions और CastMediaOptions को बदलकर, टारगेट गतिविधि को ExpandedControlsActivity पर सेट करें:

import com.google.sample.cast.refplayer.expandedcontrols.ExpandedControlsActivity

override fun getCastOptions(context: Context): CastOptions {
    val notificationOptions = NotificationOptions.Builder()
            .setTargetActivityClassName(ExpandedControlsActivity::class.java.name)
            .build()
    val mediaOptions = CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .setExpandedControllerActivityClassName(ExpandedControlsActivity::class.java.name)
            .build()
    return CastOptions.Builder()
            .setReceiverApplicationId(context.getString(R.string.app_id))
            .setCastMediaOptions(mediaOptions)
            .build()
}

रिमोट मीडिया लोड होने पर ExpandedControlsActivity दिखाने के लिए, LocalPlayerActivity loadRemoteMedia तरीके को अपडेट करें:

import com.google.sample.cast.refplayer.expandedcontrols.ExpandedControlsActivity

private fun loadRemoteMedia(position: Int, autoPlay: Boolean) {
    if (mCastSession == null) {
        return
    }
    val remoteMediaClient = mCastSession!!.remoteMediaClient ?: return
    remoteMediaClient.registerCallback(object : RemoteMediaClient.Callback() {
        override fun onStatusUpdated() {
            val intent = Intent(this@LocalPlayerActivity, ExpandedControlsActivity::class.java)
            startActivity(intent)
            remoteMediaClient.unregisterCallback(this)
        }
    })
    remoteMediaClient.load(MediaLoadRequestData.Builder()
                .setMediaInfo(buildMediaInfo())
                .setAutoplay(autoPlay)
                .setCurrentTime(position.toLong()).build())
}

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

11. Cast Connect की सुविधा जोड़ना

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

डिपेंडेंसी

ध्यान दें: Cast Connect को लागू करने के लिए, play-services-cast-framework का वर्शन 19.0.0 या उसके बाद वाला होना चाहिए.

LaunchOptions

Android TV ऐप्लिकेशन लॉन्च करने के लिए, जिसे Android रिसीवर भी कहा जाता है, हमें LaunchOptions ऑब्जेक्ट में setAndroidReceiverCompatible फ़्लैग को सही पर सेट करना होगा. यह LaunchOptions ऑब्जेक्ट यह तय करता है कि रिसीवर को कैसे लॉन्च किया जाता है. साथ ही, इसे CastOptionsProvider क्लास से मिले CastOptions को पास किया जाता है. ऊपर बताए गए फ़्लैग को false पर सेट करने से, Cast Developer Console में तय किए गए ऐप्लिकेशन आईडी के लिए वेब रिसीवर लॉन्च हो जाएगा.

CastOptionsProvider.kt फ़ाइल में, getCastOptions तरीके में यह जोड़ें:

import com.google.android.gms.cast.LaunchOptions
...
val launchOptions = LaunchOptions.Builder()
            .setAndroidReceiverCompatible(true)
            .build()
return new CastOptions.Builder()
        .setLaunchOptions(launchOptions)
        ...
        .build()

लॉन्च क्रेडेंशियल सेट करना

भेजने वाले व्यक्ति के लिए, CredentialsData को यह बताने के लिए सेट किया जा सकता है कि सेशन में कौन शामिल हो रहा है. credentials एक स्ट्रिंग है, जिसे उपयोगकर्ता तय कर सकता है. हालांकि, यह ज़रूरी है कि आपका ATV ऐप्लिकेशन इसे समझ सके. CredentialsData को सिर्फ़ लॉन्च या शामिल होने के समय, आपके Android TV ऐप्लिकेशन को पास किया जाता है. अगर कनेक्ट रहने के दौरान इसे फिर से सेट किया जाता है, तो इसे Android TV ऐप्लिकेशन पर नहीं भेजा जाएगा.

लॉन्च क्रेडेंशियल सेट करने के लिए, CredentialsData को तय करना होगा और इसे LaunchOptions ऑब्जेक्ट को पास करना होगा. अपनी CastOptionsProvider.kt फ़ाइल में मौजूद getCastOptions तरीके में यह कोड जोड़ें:

import com.google.android.gms.cast.CredentialsData
...

val credentialsData = CredentialsData.Builder()
        .setCredentials("{\"userId\": \"abc\"}")
        .build()
val launchOptions = LaunchOptions.Builder()
       ...
       .setCredentialsData(credentialsData)
       .build()

LoadRequest पर क्रेडेंशियल सेट करना

अगर आपका वेब रिसीवर ऐप्लिकेशन और Android TV ऐप्लिकेशन, credentials को अलग-अलग तरीके से हैंडल करते हैं, तो आपको हर ऐप्लिकेशन के लिए अलग-अलग credentials तय करने पड़ सकते हैं. इसके लिए, अपनी LocalPlayerActivity.kt फ़ाइल में loadRemoteMedia फ़ंक्शन के नीचे यह कोड जोड़ें:

remoteMediaClient.load(MediaLoadRequestData.Builder()
       ...
       .setCredentials("user-credentials")
       .setAtvCredentials("atv-user-credentials")
       .build())

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

Cast Connect की जांच करना

Chromecast with Google TV पर Android TV APK इंस्टॉल करने का तरीका

  1. अपने Android TV डिवाइस का आईपी पता ढूंढें. आम तौर पर, यह सेटिंग > नेटवर्क और इंटरनेट > (आपके डिवाइस से कनेक्ट किए गए नेटवर्क का नाम) में उपलब्ध होता है. दाईं ओर, आपको नेटवर्क पर मौजूद आपके डिवाइस की जानकारी और आईपी पते की जानकारी दिखेगी.
  2. टर्मिनल का इस्तेमाल करके, एडीबी के ज़रिए अपने डिवाइस से कनेक्ट करने के लिए, डिवाइस के आईपी पते का इस्तेमाल करें:
$ adb connect <device_ip_address>:5555
  1. अपने टर्मिनल विंडो में, कोडलैब के उन सैंपल के टॉप लेवल फ़ोल्डर पर जाएं जिन्हें आपने इस कोडलैब की शुरुआत में डाउनलोड किया था. उदाहरण के लिए:
$ cd Desktop/android_codelab_src
  1. इस फ़ोल्डर में मौजूद .apk फ़ाइल को अपने Android TV पर इंस्टॉल करने के लिए, यह कमांड चलाएं:
$ adb -s <device_ip_address>:5555 install android-tv-app.apk
  1. अब आपको अपने Android TV डिवाइस पर, आपके ऐप्लिकेशन मेन्यू में वीडियो कास्ट करें नाम का ऐप्लिकेशन दिखेगा.
  2. अपने Android Studio प्रोजेक्ट पर वापस जाएं. इसके बाद, अपने फ़ोन या टैबलेट पर सेंडर ऐप्लिकेशन इंस्टॉल और चलाने के लिए, 'चलाएं' बटन पर क्लिक करें. सबसे ऊपर दाएं कोने में मौजूद, कास्ट आइकॉन पर क्लिक करें. इसके बाद, उपलब्ध विकल्पों में से अपना Android TV डिवाइस चुनें. अब आपको अपने Android TV डिवाइस पर Android TV ऐप्लिकेशन लॉन्च होता हुआ दिखेगा. साथ ही, वीडियो चलाने पर, Android TV के रिमोट का इस्तेमाल करके वीडियो चलाने की सुविधा को कंट्रोल किया जा सकेगा.

12. कास्ट करने की सुविधा वाले विजेट को पसंद के मुताबिक बनाना

कास्ट विजेट को अपनी पसंद के मुताबिक बनाया जा सकता है. इसके लिए, रंग सेट करें, बटन, टेक्स्ट, और थंबनेल के दिखने का स्टाइल तय करें. साथ ही, यह चुनें कि कौनसे बटन दिखाने हैं.

res/values/styles_castvideo.xml को अपडेट करें

<style name="Theme.CastVideosTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="mediaRouteTheme">@style/CustomMediaRouterTheme</item>
    <item name="castIntroOverlayStyle">@style/CustomCastIntroOverlay</item>
    <item name="castMiniControllerStyle">@style/CustomCastMiniController</item>
    <item name="castExpandedControllerStyle">@style/CustomCastExpandedController</item>
    <item name="castExpandedControllerToolbarStyle">
        @style/ThemeOverlay.AppCompat.ActionBar
    </item>
    ...
</style>

इन कस्टम थीम का एलान करें:

<!-- Customize Cast Button -->
<style name="CustomMediaRouterTheme" parent="Theme.MediaRouter">
    <item name="mediaRouteButtonStyle">@style/CustomMediaRouteButtonStyle</item>
</style>
<style name="CustomMediaRouteButtonStyle" parent="Widget.MediaRouter.Light.MediaRouteButton">
    <item name="mediaRouteButtonTint">#EEFF41</item>
</style>

<!-- Customize Introductory Overlay -->
<style name="CustomCastIntroOverlay" parent="CastIntroOverlay">
    <item name="castButtonTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Button</item>
    <item name="castTitleTextAppearance">@style/TextAppearance.CustomCastIntroOverlay.Title</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Button" parent="android:style/TextAppearance">
    <item name="android:textColor">#FFFFFF</item>
</style>
<style name="TextAppearance.CustomCastIntroOverlay.Title" parent="android:style/TextAppearance.Large">
    <item name="android:textColor">#FFFFFF</item>
</style>

<!-- Customize Mini Controller -->
<style name="CustomCastMiniController" parent="CastMiniController">
    <item name="castShowImageThumbnail">true</item>
    <item name="castTitleTextAppearance">@style/TextAppearance.AppCompat.Subhead</item>
    <item name="castSubtitleTextAppearance">@style/TextAppearance.AppCompat.Caption</item>
    <item name="castBackground">@color/accent</item>
    <item name="castProgressBarColor">@color/orange</item>
</style>

<!-- Customize Expanded Controller -->
<style name="CustomCastExpandedController" parent="CastExpandedController">
    <item name="castButtonColor">#FFFFFF</item>
    <item name="castPlayButtonDrawable">@drawable/cast_ic_expanded_controller_play</item>
    <item name="castPauseButtonDrawable">@drawable/cast_ic_expanded_controller_pause</item>
    <item name="castStopButtonDrawable">@drawable/cast_ic_expanded_controller_stop</item>
</style>

13. बधाई हो

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

ज़्यादा जानकारी के लिए, Android Sender डेवलपर गाइड देखें.