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