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 मिनी कंट्रोलर जोड़ने का तरीका.
  • मीडिया सूचनाओं और लॉक स्क्रीन कंट्रोल की सुविधा देने का तरीका.
  • बड़ा किया गया कंट्रोलर जोड़ने का तरीका.
  • शुरुआती ओवरले देने का तरीका.
  • Cast विजेट को पसंद के मुताबिक बनाने का तरीका.
  • Cast Connect के साथ इंटिग्रेट करने का तरीका

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

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

अनुभव

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

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

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

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

शुरुआती इंटरमीडिएट कुशल

टीवी देखने के अपने अनुभव को आप कितनी रेटिंग देंगे/देंगी?

शुरुआती इंटरमीडिएट कुशल

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

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

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

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

कंपास का आइकॉन

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

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

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

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

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

अपने 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 में 'Gredle के साथ प्रोजेक्ट सिंक करें' बटन Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें बटन पर क्लिक करें.
  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 वीडियो ऐप्लिकेशन चल रहा है; स्क्रीन के सबसे ऊपर दाएं कोने में दिख रहा 'कास्ट करें' बटन

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

प्रोजेक्ट को बिना किसी गड़बड़ी के सिंक करने के लिए सिंक करें.

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

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

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

जब आप अपना 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
    }
}

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

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

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

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

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

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

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

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

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

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

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

private var mLocation: PlaybackLocation? = null

enum class PlaybackLocation {
    LOCAL, REMOTE
}

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

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

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

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

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

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

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

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

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

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

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

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

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

इस इमेज में, Cast वीडियो के Android ऐप्लिकेशन पर &#39;कास्ट करें&#39; बटन के आस-पास, कास्ट ओवरले दिखाया गया है

कास्ट 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 विधि में बदलाव करके और onResume और onPause तरीकों को ओवरराइड करके, कास्ट डिवाइस उपलब्ध होने पर showIntroductoryOverlay तरीके को कॉल करें, ताकि वे:

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 नाम का एक विजेट उपलब्ध कराता है. यह एक ऐब्स्ट्रैक्ट क्लास है, जिसे कास्ट बटन जोड़ने के लिए आपको सब-क्लास की ज़रूरत होती है.

सबसे पहले, 'कास्ट करें' बटन उपलब्ध कराने के लिए, बड़े किए गए कंट्रोलर के लिए 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, कास्ट इंफ़्रास्ट्रक्चर के ऊपर बनता है. इसमें, आपका 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 तय करने की ज़रूरत पड़ सकती है. इसे ठीक करने के लिए, loadRemoteMedia फ़ंक्शन में अपनी LocalPlayerActivity.kt फ़ाइल में यह कोड जोड़ें:

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. Cast विजेट को पसंद के मुताबिक बनाएं

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

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 पर भेजने वाले व्यक्ति की डेवलपर गाइड देखें.