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

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

Google Cast का लोगो

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

Google Cast क्या है?

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

Google Cast SDK टूल की मदद से, अपने ऐप्लिकेशन के डेटा को बढ़ाया जा सकता है, ताकि टीवी या साउंड सिस्टम को कंट्रोल किया जा सके. कास्ट 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 की ज़रूरत होती है. हालांकि, कोडलैब के बाकी टूल के लिए यह ज़रूरी नहीं है. अगर आपके पास AdSense कनेक्ट नहीं है, तो इस ट्यूटोरियल को खत्म करने के लिए, Cast Connect सहायता जोड़ें चरण को बेझिझक छोड़ दें.

अनुभव

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

आपको इस ट्यूटोरियल का इस्तेमाल कैसे करना है?

इसे सिर्फ़ पढ़ें इसे पढ़ें और सभी कसरतों को पूरा करें

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

नया इंटरमीडिएट कुशल

आपके हिसाब से टीवी देखने का अनुभव कैसा रहा?

नई इंटरमीडिएट कुशल

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

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

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

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

कंपास के जोड़े का आइकॉन

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

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

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

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

फ़ाइल > Android Studio का 'Grdle के साथ प्रोजेक्ट सिंक करें' बटन Grdle Files के साथ प्रोजेक्ट सिंक करें पर क्लिक करें.

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

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

वीडियो ऐप्लिकेशन में 'कास्ट करें' बटन पर क्लिक करें और अपना Google Cast डिवाइस चुनें.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ऐप डिज़ाइन

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

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

VideoBrowserActivity

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

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

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

LocalPlayerActivity

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

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

डिपेंडेंसी

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

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

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

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

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

डिपेंडेंसी

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

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"
}

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

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

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

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

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

प्रोजेक्ट के 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 अब शुरू हो गया है, इसलिए हमें कास्ट बटन जोड़ना होगा, ताकि लोग कास्ट डिवाइस चुन सकें. कास्ट बटन को MediaRouteButton ने MediaRouter की सहायता लाइब्रेरी से लागू किया. गतिविधि में जोड़े जा सकने वाले किसी भी ऐक्शन आइकॉन की तरह (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 को कास्ट फ़्रेमवर्क पर जोड़ने के लिए, 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 का रन बटन, जो दाईं ओर इशारा करता है और हरे रंग का त्रिभुज हैचलाएं बटन पर क्लिक करें. आपको ऐप्लिकेशन के कार्रवाई बार में एक कास्ट बटन दिखाई देगा और जब आप उस पर क्लिक करेंगे, तो वह आपके लोकल नेटवर्क पर कास्ट डिवाइस को सूची में शामिल कर लेगा. डिवाइस डिस्कवरी को CastContext अपने-आप मैनेज करता है. अपना कास्ट डिवाइस चुनें और सैंपल पाने वाला ऐप्लिकेशन, कास्ट डिवाइस पर लोड हो जाएगा. ब्राउज़ करने की गतिविधि और लोकल प्लेयर की गतिविधि के बीच नेविगेट किया जा सकता है. साथ ही, 'कास्ट करें' बटन की स्थिति सिंक में रखी जाती है.

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

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

Android फ़ोन की इमेज, जिसमें &#39;वीडियो कास्ट करें&#39; ऐप्लिकेशन चल रहा है

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

मीडिया कास्ट किया जा रहा है

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

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

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

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

private var mLocation: PlaybackLocation? = null

enum class PlaybackLocation {
    LOCAL, REMOTE
}

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

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

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

कास्ट सेशन को मैनेज करना

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

जब लोग कास्ट बटन से किसी डिवाइस को चुनते हैं, तब कास्ट सेशन अपने-आप शुरू हो जाएगा और डिसकनेक्ट करने पर यह अपने-आप बंद हो जाएगा. नेटवर्किंग की समस्याओं की वजह से, रिसीवर सेशन से दोबारा कनेक्ट होने की सुविधा कास्ट 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)
        }
    }
    ...
}

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

कास्ट SDK टूल में, RemoteMediaClient सुविधाजनक एपीआई का सेट उपलब्ध कराता है. इसकी मदद से, रिसीवर पर रिमोट मीडिया प्लेबैक को मैनेज किया जा सकता है. मीडिया चलाने की सुविधा देने वाले CastSession के लिए, SDK टूल 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 का रन बटन, जो दाईं ओर इशारा करता है और हरे रंग का त्रिभुज हैचलाएं बटन पर क्लिक करें. अपने कास्ट डिवाइस से कनेक्ट करें और वीडियो चलाना शुरू करें. आपको रिसीवर पर वीडियो चल रहा दिखेगा.

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

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

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 का रन बटन, जो दाईं ओर इशारा करता है और हरे रंग का त्रिभुज हैचलाएं बटन पर क्लिक करें. रिसीवर पर वीडियो चलाने के बाद, आपको हर गतिविधि के नीचे मिनी कंट्रोलर दिखेगा. मिनी कंट्रोलर का इस्तेमाल करके, रिमोट प्लेबैक को कंट्रोल किया जा सकता है. अगर ब्राउज़ करने की गतिविधि और लोकल प्लेयर की गतिविधि के बीच नेविगेट किया जाता है, तो मिनी कंट्रोलर की स्थिति, रिसीवर की मीडिया प्लेबैक स्थिति के साथ सिंक रहेगी.

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

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

9. शुरुआती ओवरले

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

इलस्ट्रेशन में, Cast Videos Android ऐप्लिकेशन के कास्ट बटन के चारों ओर शुरुआती कास्ट ओवरले दिखाया गया है

Cast SDK टूल, कस्टम व्यू, IntroductoryOverlay उपलब्ध कराता है. इसका इस्तेमाल, उपयोगकर्ताओं को पहली बार कास्ट बटन दिखाने पर, उसे हाइलाइट करने के लिए किया जा सकता है. 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 जोड़ें और कास्ट डिवाइस उपलब्ध होने पर, onCreate तरीके में बदलाव करके showIntroductoryOverlay तरीके को कॉल करें. ऐसा करने के लिए, 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 का रन बटन, जो दाईं ओर इशारा करता है और हरे रंग का त्रिभुज हैचलाएं बटन पर क्लिक करें. इसके बाद, आपको शुरुआती ओवरले दिखेगा. अगर ओवरले नहीं दिखता है, तो ऐप्लिकेशन का डेटा मिटा दें.

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

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

Android फ़ोन पर चल रहे वीडियो का इलस्ट्रेशन, जिसमें बड़ा किया गया कंट्रोलर ओवरले किया हुआ है

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

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

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

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

डिपेंडेंसी

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

LaunchOptions

Android TV ऐप्लिकेशन लॉन्च करने के लिए, हमें LaunchOptions ऑब्जेक्ट में setAndroidReceiverCompatible फ़्लैग को सही पर सेट करना होगा. इसे Android रिसीवर भी कहा जाता है. यह 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())

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

Cast Connect को टेस्ट किया जा रहा है

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

  1. अपने Android TV डिवाइस का आईपी पता ढूंढें. आम तौर पर, यह सेटिंग > नेटवर्क और इंटरनेट > (उस नेटवर्क का नाम जिससे आपका डिवाइस कनेक्ट है) में उपलब्ध होता है. दाईं ओर, यह जानकारी और नेटवर्क पर आपके डिवाइस का आईपी दिखाएगा.
  2. टर्मिनल का इस्तेमाल करके अपने डिवाइस को ADB से कनेक्ट करने के लिए, आईपी पते का इस्तेमाल करें:
$ 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 सेंडर की डेवलपर गाइड देखें.