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

इस कोडलैब में, आपको यह सिखाया जाएगा कि मौजूदा Android TV ऐप्लिकेशन में बदलाव करके, उसे कास्ट करने और कम्यूनिकेट करने की सुविधा देने वाले मौजूदा Cast Sender ऐप्लिकेशन के साथ काम करने लायक कैसे बनाया जाए.
Google Cast और Cast Connect क्या है?
Google Cast की मदद से, लोग अपने फ़ोन या टैबलेट पर मौजूद कॉन्टेंट को टीवी पर कास्ट कर सकते हैं. Google Cast के किसी सेशन में आम तौर पर दो कॉम्पोनेंट होते हैं — सेंडर और रिसीवर ऐप्लिकेशन. सेंडर ऐप्लिकेशन, जैसे कि मोबाइल ऐप्लिकेशन या Youtube.com जैसी वेबसाइट, Cast receiver ऐप्लिकेशन पर कॉन्टेंट चलाने की सुविधा शुरू करती हैं और उसे कंट्रोल करती हैं. कास्ट रिसीवर ऐप्लिकेशन, एचटीएमएल 5 ऐप्लिकेशन होते हैं. ये Chromecast और Android TV डिवाइसों पर काम करते हैं.
कास्ट सेशन की ज़्यादातर जानकारी, रिसीवर ऐप्लिकेशन पर सेव की जाती है. जब स्थिति अपडेट होती है, जैसे कि कोई नया मीडिया आइटम लोड किया जाता है, तो सभी डिवाइसों पर मीडिया स्टेटस ब्रॉडकास्ट किया जाता है. इन ब्रॉडकास्ट में, कास्ट सेशन की मौजूदा स्थिति के बारे में जानकारी होती है. भेजने वाले ऐप्लिकेशन, इस मीडिया स्टेटस का इस्तेमाल करके अपने यूज़र इंटरफ़ेस (यूआई) में प्लेबैक की जानकारी दिखाते हैं.
Cast Connect, इस इन्फ़्रास्ट्रक्चर पर काम करता है. इसमें आपका Android TV ऐप्लिकेशन, रिसीवर के तौर पर काम करता है. Cast Connect लाइब्रेरी की मदद से, आपका Android TV ऐप्लिकेशन मैसेज पा सकता है और मीडिया की स्थिति को ब्रॉडकास्ट कर सकता है. ऐसा तब होता है, जब वह कास्ट रिसीवर ऐप्लिकेशन हो.
हम क्या बनाने जा रहे हैं?
इस कोडलैब को पूरा करने के बाद, कास्ट करने वाले ऐप्लिकेशन का इस्तेमाल करके, Android TV ऐप्लिकेशन पर वीडियो कास्ट किए जा सकेंगे. Android TV ऐप्लिकेशन, कास्ट प्रोटोकॉल के ज़रिए कास्ट करने वाले ऐप्लिकेशन से भी कम्यूनिकेट कर सकता है.
आपको क्या सीखने को मिलेगा
- किसी एटीवी ऐप्लिकेशन के सैंपल में Cast Connect लाइब्रेरी जोड़ने का तरीका.
- कास्ट करने वाले डिवाइस को कनेक्ट करने और ATV ऐप्लिकेशन लॉन्च करने का तरीका.
- कास्ट करने की सुविधा देने वाले ऐप्लिकेशन से, ATV ऐप्लिकेशन पर मीडिया चलाने की सुविधा कैसे शुरू करें.
- ATV ऐप्लिकेशन से, कास्ट करने वाले ऐप्लिकेशन को मीडिया की स्थिति कैसे भेजी जाती है.
आपको किन चीज़ों की ज़रूरत होगी
- Android SDK का नया वर्शन.
- Android Studio का नया वर्शन. खास तौर पर,
Chipmunk | 2021.2.1या उसके बाद के वर्शन. - Android TV डिवाइस, जिसमें डेवलपर के लिए सेटिंग और टूल के विकल्प और यूएसबी डीबग करने की सुविधा चालू हो.
- ऐसा Android फ़ोन जिसमें डेवलपर के लिए सेटिंग और टूल और यूएसबी डीबग करना चालू हो.
- यूएसबी डेटा केबल, ताकि अपने Android फ़ोन और Android TV डिवाइसों को डेवलपमेंट कंप्यूटर से कनेक्ट किया जा सके.
- Kotlin का इस्तेमाल करके Android ऐप्लिकेशन बनाने की बुनियादी जानकारी.
2. सैंपल कोड पाना
अपने कंप्यूटर पर सभी सैंपल कोड डाउनलोड किए जा सकते हैं...
इसके बाद, डाउनलोड की गई zip फ़ाइल को अनपैक करें.
3. सैंपल ऐप्लिकेशन चलाना
सबसे पहले, आइए देखते हैं कि पूरा किया गया सैंपल ऐप्लिकेशन कैसा दिखता है. Android TV ऐप्लिकेशन, Leanback यूज़र इंटरफ़ेस (यूआई) और बेसिक वीडियो प्लेयर का इस्तेमाल करता है. उपयोगकर्ता, सूची से कोई वीडियो चुन सकता है. इसके बाद, चुने गए वीडियो को टीवी पर चलाया जा सकता है. साथ में दिए गए मोबाइल सेंडर ऐप्लिकेशन की मदद से, कोई व्यक्ति Android TV ऐप्लिकेशन पर वीडियो भी कास्ट कर सकता है.

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

सुरक्षा से जुड़ी वजहों से, रजिस्टर किए बिना Cast Connect की सुविधा सिर्फ़ उन ऐप्लिकेशन के लिए काम करेगी जिन्हें Google Play Store से इंस्टॉल किया गया है. रजिस्ट्रेशन की प्रोसेस शुरू करने के 15 मिनट बाद, अपने डिवाइस को रीस्टार्ट करें.
Android डिवाइस पर, भेजने वाला ऐप्लिकेशन इंस्टॉल करना
मोबाइल डिवाइस से अनुरोध भेजने की सुविधा को टेस्ट करने के लिए, हमने एक सामान्य सेंडर ऐप्लिकेशन उपलब्ध कराया है. इसे सोर्स कोड ज़िप डाउनलोड में CastVideos.apk के तौर पर दिया गया है.mobile-sender-0629.apk हम APK इंस्टॉल करने के लिए, ADB का इस्तेमाल करेंगे. अगर आपने Cast Videos का कोई दूसरा वर्शन पहले से इंस्टॉल किया है, तो कृपया जारी रखने से पहले, डिवाइस पर मौजूद सभी प्रोफ़ाइलों से उस वर्शन को अनइंस्टॉल करें.
- अपने Android फ़ोन पर, डेवलपर के लिए सेटिंग और टूल और यूएसबी डीबग करने की सुविधा चालू करें.
- अपने Android फ़ोन को डेवलपमेंट कंप्यूटर से कनेक्ट करने के लिए, यूएसबी डेटा केबल लगाएं.
- अपने Android फ़ोन पर
mobile-sender-0629.apkइंस्टॉल करें.

- आपको अपने Android फ़ोन पर, वीडियो कास्ट करें की सुविधा देने वाला ऐप्लिकेशन मिल सकता है.


Android TV ऐप्लिकेशन इंस्टॉल करना
यहां दिए गए निर्देशों में, Android Studio में पूरा किया गया सैंपल ऐप्लिकेशन खोलने और चलाने का तरीका बताया गया है:
- वेलकम स्क्रीन पर मौजूद प्रोजेक्ट इंपोर्ट करें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू के विकल्प चुनें.
- सैंपल कोड फ़ोल्डर से

app-doneडायरेक्ट्री चुनें और ठीक है पर क्लिक करें. - File >
Sync Project with Gradle Files पर क्लिक करें. - अपने Android TV डिवाइस पर, डेवलपर के लिए सेटिंग और टूल और यूएसबी डीबग करने की सुविधा चालू करें.
- ADB को अपने Android TV डिवाइस से कनेक्ट करें. इसके बाद, डिवाइस को Android Studio में दिखना चाहिए.

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

4. स्टार्ट प्रोजेक्ट तैयार करना
हमने ऐप्लिकेशन में Cast Connect इंटिग्रेशन की पुष्टि कर ली है. अब हमें डाउनलोड किए गए स्टार्ट ऐप्लिकेशन में Cast Connect की सुविधा जोड़नी होगी. अब Android Studio का इस्तेमाल करके, स्टार्टर प्रोजेक्ट पर काम किया जा सकता है:
- वेलकम स्क्रीन पर मौजूद प्रोजेक्ट इंपोर्ट करें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू के विकल्प चुनें.
- सैंपल कोड फ़ोल्डर से

app-startडायरेक्ट्री चुनें और ठीक है पर क्लिक करें. - File >
Sync Project with Gradle Files पर क्लिक करें. - ATV डिवाइस चुनें. इसके बाद, ऐप्लिकेशन चलाने और यूज़र इंटरफ़ेस (यूआई) एक्सप्लोर करने के लिए,
चलाएं बटन पर क्लिक करें. 

ऐप डिज़ाइन
यह ऐप्लिकेशन, उपयोगकर्ता को ब्राउज़ करने के लिए वीडियो की सूची उपलब्ध कराता है. उपयोगकर्ता, Android TV पर चलाने के लिए कोई वीडियो चुन सकते हैं. ऐप्लिकेशन में दो मुख्य गतिविधियां शामिल हैं: MainActivity और PlaybackActivity.
MainActivity
इस गतिविधि में एक फ़्रैगमेंट (MainFragment) शामिल है. वीडियो की सूची और उनसे जुड़ा मेटाडेटा, MovieList क्लास में कॉन्फ़िगर किया गया है. साथ ही, Movie ऑब्जेक्ट की सूची बनाने के लिए, setupMovies() मेथड को कॉल किया गया है.
Movie ऑब्जेक्ट, टाइटल, ब्यौरे, इमेज थंबनेल, और वीडियो यूआरएल वाली वीडियो इकाई को दिखाता है. हर Movie ऑब्जेक्ट, CardPresenter से जुड़ा होता है. इससे वीडियो के थंबनेल को टाइटल और स्टूडियो के साथ दिखाया जाता है. साथ ही, इसे ArrayObjectAdapter को पास किया जाता है.
किसी आइटम को चुनने पर, उससे जुड़ा Movie ऑब्जेक्ट, PlaybackActivity को पास किया जाता है.
PlaybackActivity
इस गतिविधि में एक फ़्रैगमेंट (PlaybackVideoFragment) होता है, जो ExoPlayer के साथ VideoView को होस्ट करता है. इसमें कुछ मीडिया कंट्रोल और एक टेक्स्ट एरिया होता है. इस टेक्स्ट एरिया में, चुने गए वीडियो का ब्यौरा दिखाया जाता है. साथ ही, यह उपयोगकर्ता को Android TV पर वीडियो चलाने की अनुमति देता है. उपयोगकर्ता, रिमोट कंट्रोल का इस्तेमाल करके वीडियो चला/रोक सकता है या उन्हें आगे-पीछे कर सकता है.
Cast Connect की ज़रूरी शर्तें
Cast Connect, Google Play services के नए वर्शन का इस्तेमाल करता है. इसके लिए, आपके Android TV ऐप्लिकेशन को अपडेट करना ज़रूरी है, ताकि वह AndroidX नेमस्पेस का इस्तेमाल कर सके.
अपने Android TV ऐप्लिकेशन में Cast Connect की सुविधा इस्तेमाल करने के लिए, आपको मीडिया सेशन से इवेंट बनाने और उन्हें सपोर्ट करने होंगे. Cast Connect लाइब्रेरी, मीडिया सेशन की स्थिति के आधार पर मीडिया स्टेटस जनरेट करती है. Cast Connect लाइब्रेरी, आपके मीडिया सेशन का इस्तेमाल यह सिग्नल देने के लिए भी करती है कि उसे किसी व्यक्ति से कुछ मैसेज मिले हैं. जैसे, रोकने का मैसेज.
5. कास्ट करने की सुविधा के लिए सहायता कॉन्फ़िगर करना
डिपेंडेंसी
ज़रूरी लाइब्रेरी डिपेंडेंसी शामिल करने के लिए, ऐप्लिकेशन की build.gradle फ़ाइल को अपडेट करें:
dependencies {
....
// Cast Connect libraries
implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
implementation 'com.google.android.gms:play-services-cast:21.1.0'
}
प्रोजेक्ट को सिंक करें, ताकि यह पुष्टि की जा सके कि प्रोजेक्ट में कोई गड़बड़ी नहीं है.
डेटा लेयर में इवेंट बनाने की प्रोसेस
CastReceiverContext एक सिंगलटन ऑब्जेक्ट है, जो Cast के सभी इंटरैक्शन को मैनेज करता है. CastReceiverContext को शुरू करते समय CastReceiverOptions उपलब्ध कराने के लिए, आपको ReceiverOptionsProvider इंटरफ़ेस लागू करना होगा.
CastReceiverOptionsProvider.kt फ़ाइल बनाएं और प्रोजेक्ट में यह क्लास जोड़ें:
package com.google.sample.cast.castconnect
import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions
class CastReceiverOptionsProvider : ReceiverOptionsProvider {
override fun getOptions(context: Context): CastReceiverOptions {
return CastReceiverOptions.Builder(context)
.setStatusText("Cast Connect Codelab")
.build()
}
}
इसके बाद, ऐप्लिकेशन की AndroidManifest.xml फ़ाइल के <application> टैग में, पैसे पाने वाले के विकल्प देने वाली कंपनी के बारे में बताएं:
<application>
...
<meta-data
android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>
कास्ट करने वाले डिवाइस से ATV ऐप्लिकेशन को कनेक्ट करने के लिए, वह गतिविधि चुनें जिसे आपको लॉन्च करना है. इस कोडलैब में, हम कास्ट सेशन शुरू होने पर ऐप्लिकेशन का MainActivity लॉन्च करेंगे. AndroidManifest.xml फ़ाइल में, MainActivity में लॉन्च इंटेंट फ़िल्टर जोड़ें.
<activity android:name=".MainActivity">
...
<intent-filter>
<action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
कास्ट किए जाने वाले डिवाइस के कॉन्टेक्स्ट का लाइफ़साइकल
ऐप्लिकेशन लॉन्च होने पर CastReceiverContext शुरू करें और ऐप्लिकेशन के बैकग्राउंड में जाने पर CastReceiverContext बंद करें. हमारा सुझाव है कि CastReceiverContext.start() और CastReceiverContext.stop() को कॉल करने की प्रोसेस को मैनेज करने के लिए, androidx.lifecycle लाइब्रेरी से LifecycleObserver का इस्तेमाल करें
MyApplication.kt फ़ाइल खोलें. इसके बाद, ऐप्लिकेशन के onCreate तरीके में initInstance() को कॉल करके, कास्ट कॉन्टेक्स्ट को शुरू करें. AppLifeCycleObserver क्लास start() में, ऐप्लिकेशन के फिर से शुरू होने पर CastReceiverContext और ऐप्लिकेशन के रुकने पर stop():
package com.google.sample.cast.castconnect
import com.google.android.gms.cast.tv.CastReceiverContext
...
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
CastReceiverContext.initInstance(this)
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
class AppLifecycleObserver : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
Log.d(LOG_TAG, "onResume")
CastReceiverContext.getInstance().start()
}
override fun onPause(owner: LifecycleOwner) {
Log.d(LOG_TAG, "onPause")
CastReceiverContext.getInstance().stop()
}
}
}
MediaSession को MediaManager से कनेक्ट करना
MediaManager, CastReceiverContext सिंग्लेटन की प्रॉपर्टी है. यह मीडिया के स्टेटस को मैनेज करता है, लोड इंटेंट को हैंडल करता है, मीडिया नेमस्पेस के मैसेज को भेजने वालों से मीडिया कमांड में बदलता है, और मीडिया के स्टेटस को भेजने वालों को वापस भेजता है.
MediaSession बनाते समय, आपको MediaManager को मौजूदा MediaSession टोकन भी देना होगा. इससे MediaManager को पता चलेगा कि कमांड कहां भेजनी हैं और मीडिया चलाने की स्थिति कहां से वापस लानी है. PlaybackVideoFragment.kt फ़ाइल में, पक्का करें कि MediaManager पर टोकन सेट करने से पहले, MediaSession को शुरू किया गया हो.
import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...
class PlaybackVideoFragment : VideoSupportFragment() {
private var castReceiverContext: CastReceiverContext? = null
...
private fun initializePlayer() {
if (mPlayer == null) {
...
mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
}
}
}
}
वीडियो चलाने की सुविधा बंद होने पर, आपको MediaSession को रिलीज़ करना होगा. इसके लिए, आपको MediaManager पर एक शून्य टोकन सेट करना होगा:
private fun releasePlayer() {
mMediaSession?.release()
castReceiverContext?.mediaManager?.setSessionCompatToken(null)
...
}
सैंपल ऐप्लिकेशन चलाएं
अपने एटीवी डिवाइस पर ऐप्लिकेशन को डिप्लॉय करने के लिए,
चलाएं बटन पर क्लिक करें. इसके बाद, ऐप्लिकेशन बंद करें और एटीवी की होम स्क्रीन पर वापस जाएं. सेंडर डिवाइस पर, कास्ट बटन
पर क्लिक करें और अपना Android TV डिवाइस चुनें. आपको दिखेगा कि ATV डिवाइस पर ATV ऐप्लिकेशन लॉन्च हो गया है और 'कास्ट करें' बटन की स्थिति 'कनेक्ट किया गया' है.
6. मीडिया लोड हो रहा है
लोड कमांड, उस पैकेज के नाम के साथ इंटेंट के ज़रिए भेजी जाती है जिसे आपने डेवलपर कंसोल में तय किया है. आपको अपने Android TV ऐप्लिकेशन में, पहले से तय किया गया यह इंटेंट फ़िल्टर जोड़ना होगा. इससे यह तय किया जा सकेगा कि कौनसी टारगेट ऐक्टिविटी को यह इंटेंट मिलेगा. AndroidManifest.xml फ़ाइल में, PlayerActivity में लोड इंटेंट फ़िल्टर जोड़ें:
<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Android TV पर लोड करने के अनुरोधों को मैनेज करना
अब ऐक्टिविटी को लोड करने के अनुरोध वाले इस इंटेंट को पाने के लिए कॉन्फ़िगर किया गया है. इसलिए, हमें इसे हैंडल करना होगा.
गतिविधि शुरू होने पर, ऐप्लिकेशन processIntent नाम के एक निजी तरीके को कॉल करता है. इस तरीके में, आने वाले इंटेंट को प्रोसेस करने का लॉजिक होता है. लोड करने के अनुरोध को मैनेज करने के लिए, हम इस तरीके में बदलाव करेंगे. साथ ही, MediaManager इंस्टेंस के onNewIntent तरीके को कॉल करके, इंटेंट को आगे प्रोसेस करने के लिए भेजेंगे. अगर MediaManager को पता चलता है कि अनुरोध, लोड करने का अनुरोध है, तो वह इंटेंट से MediaLoadRequestData ऑब्जेक्ट को निकालता है और MediaLoadCommandCallback.onLoad() को शुरू करता है. लोड करने के अनुरोध वाले इंटेंट को मैनेज करने के लिए, PlaybackVideoFragment.kt फ़ाइल में processIntent तरीके में बदलाव करें:
fun processIntent(intent: Intent?) {
val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
// Pass intent to Cast SDK
if (mediaManager.onNewIntent(intent)) {
return
}
// Clears all overrides in the modifier.
mediaManager.getMediaStatusModifier().clear()
// If the SDK doesn't recognize the intent, handle the intent with your own logic.
...
}
इसके बाद, हम ऐब्सट्रैक्ट क्लास MediaLoadCommandCallback को बढ़ाएंगे. इससे onLoad() तरीके को बदला जा सकेगा, जिसे MediaManager ने कॉल किया था. यह तरीका, लोड करने के अनुरोध का डेटा पाता है और उसे Movie ऑब्जेक्ट में बदलता है. बदलने के बाद, फ़िल्म को लोकल प्लेयर पर चलाया जाता है. इसके बाद, MediaManager को MediaLoadRequest से अपडेट किया जाता है. साथ ही, यह कनेक्ट किए गए सेंडर को MediaStatus ब्रॉडकास्ट करता है. PlaybackVideoFragment.kt फ़ाइल में MyMediaLoadCommandCallback नाम की नेस्ट की गई निजी क्लास बनाएं:
import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...
private inner class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
override fun onLoad(
senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
return if (mediaLoadRequestData == null) {
// Throw MediaException to indicate load failure.
Tasks.forException(MediaException(
MediaError.Builder()
.setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
.setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
.build()))
} else Tasks.call {
play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
// Update media metadata and state
val mediaManager = castReceiverContext!!.mediaManager
mediaManager.setDataFromLoad(mediaLoadRequestData)
mediaLoadRequestData
}
}
}
private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
if (mediaLoadRequestData == null) {
return null
}
val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
var videoUrl: String = mediaInfo.getContentId()
if (mediaInfo.getContentUrl() != null) {
videoUrl = mediaInfo.getContentUrl()
}
val metadata: MediaMetadata = mediaInfo.getMetadata()
val movie = Movie()
movie.videoUrl = videoUrl
movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
if(metadata?.hasImages() == true) {
movie.cardImageUrl = metadata.images[0].url.toString()
}
return movie
}
अब जबकि कॉलबैक तय हो चुका है, हमें इसे MediaManager में रजिस्टर करना होगा. MediaManager.onNewIntent() को कॉल करने से पहले, कॉलबैक को रजिस्टर करना ज़रूरी है. प्लेयर के शुरू होने पर, setMediaLoadCommandCallback जोड़ें:
private fun initializePlayer() {
if (mPlayer == null) {
...
mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager: MediaManager = castReceiverContext.getMediaManager()
mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
}
}
}
सैंपल ऐप्लिकेशन चलाएं
अपने एटीवी डिवाइस पर ऐप्लिकेशन डिप्लॉय करने के लिए,
चलाएं बटन पर क्लिक करें. सेंडर डिवाइस पर, कास्ट बटन
पर क्लिक करें और अपना Android TV डिवाइस चुनें. ATV ऐप्लिकेशन, ATV डिवाइस पर लॉन्च हो जाएगा. मोबाइल पर कोई वीडियो चुनें. इसके बाद, वह वीडियो Android TV पर चलने लगेगा. देखें कि आपको उस फ़ोन पर कोई सूचना मिली है या नहीं जिस पर वीडियो चलाने के कंट्रोल मौजूद हैं. रोकें जैसे कंट्रोल का इस्तेमाल करके देखें. इससे ATV डिवाइस पर चल रहा वीडियो रुक जाना चाहिए.
7. कास्ट कंट्रोल करने के लिए निर्देश देने की सुविधा
मौजूदा ऐप्लिकेशन अब मीडिया सेशन के साथ काम करने वाले बुनियादी निर्देशों के साथ काम करता है. जैसे, चलाना, रोकना, और ढूंढना. हालांकि, कास्ट कंट्रोल करने के लिए इस्तेमाल की जाने वाली कुछ कमांड, मीडिया सेशन में उपलब्ध नहीं होती हैं. कास्ट करने की सुविधा को कंट्रोल करने वाली उन कमांड का इस्तेमाल करने के लिए, आपको MediaCommandCallback को रजिस्टर करना होगा.
जब प्लेयर शुरू हो जाए, तब setMediaCommandCallback का इस्तेमाल करके MediaManager इंस्टेंस में MyMediaCommandCallback जोड़ें:
private fun initializePlayer() {
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager = castReceiverContext!!.mediaManager
...
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
}
}
तरीकों को बदलने के लिए, MyMediaCommandCallback क्लास बनाएं. जैसे, Cast कंट्रोल करने के उन निर्देशों के लिए onQueueUpdate():
private inner class MyMediaCommandCallback : MediaCommandCallback() {
override fun onQueueUpdate(
senderId: String?,
queueUpdateRequestData: QueueUpdateRequestData
): Task<Void> {
Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
// Queue Prev / Next
if (queueUpdateRequestData.getJump() != null) {
Toast.makeText(
getActivity(),
"onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
Toast.LENGTH_SHORT
).show()
}
return super.onQueueUpdate(senderId, queueUpdateRequestData)
}
}
8. मीडिया की स्थिति के साथ काम करना
मीडिया की स्थिति में बदलाव करना
Cast Connect, मीडिया सेशन से मीडिया की बुनियादी स्थिति की जानकारी पाता है. ऐडवांस सुविधाओं के लिए, आपका Android TV ऐप्लिकेशन MediaStatusModifier के ज़रिए, स्थिति की अतिरिक्त प्रॉपर्टी तय कर सकता है और उन्हें बदल सकता है. MediaStatusModifier हमेशा उस MediaSession पर काम करेगा जिसे आपने CastReceiverContext में सेट किया है.
उदाहरण के लिए, onLoad कॉलबैक ट्रिगर होने पर setMediaCommandSupported के बारे में बताने के लिए:
import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
fun onLoad(
senderId: String?,
mediaLoadRequestData: MediaLoadRequestData
): Task<MediaLoadRequestData> {
Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
...
return Tasks.call({
play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
...
// Use MediaStatusModifier to provide additional information for Cast senders.
mediaManager.getMediaStatusModifier()
.setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
.setIsPlayingAd(false)
mediaManager.broadcastMediaStatus()
// Return the resolved MediaLoadRequestData to indicate load success.
mediaLoadRequestData
})
}
}
मीडिया स्टेटस को भेजने से पहले रोकना
वेब रिसीवर SDK के MessageInterceptor की तरह, MediaManager में MediaStatusWriter तय किया जा सकता है. इससे कनेक्ट किए गए सेंडर को ब्रॉडकास्ट करने से पहले, MediaStatus में अतिरिक्त बदलाव किए जा सकते हैं.
उदाहरण के लिए, मोबाइल पर मैसेज भेजने वाले लोगों को मैसेज भेजने से पहले, MediaStatus में कस्टम डेटा सेट किया जा सकता है:
import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...
private fun initializePlayer() {
if (mPlayer == null) {
...
if (castReceiverContext != null) {
...
val mediaManager: MediaManager = castReceiverContext.getMediaManager()
...
// Use MediaStatusInterceptor to process the MediaStatus before sending out.
mediaManager.setMediaStatusInterceptor(
MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
try {
mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
} catch (e: JSONException) {
Log.e(LOG_TAG,e.message,e);
}
})
}
}
}
9. बधाई हो
अब आपको Cast Connect Library का इस्तेमाल करके, Android TV ऐप्लिकेशन में कास्ट करने की सुविधा चालू करने का तरीका पता चल गया है.
ज़्यादा जानकारी के लिए, डेवलपर गाइड देखें: /cast/docs/android_tv_receiver.