1. खास जानकारी
इस कोडलैब में, आपको किसी मौजूदा Android TV ऐप्लिकेशन में बदलाव करने का तरीका बताया जाएगा. इससे, आपके मौजूदा Cast करने वाले ऐप्लिकेशन से कास्ट करने और कम्यूनिकेट करने की सुविधा काम कर पाएगी.
Google Cast और Cast Connect क्या है?
Google Cast की मदद से, उपयोगकर्ता अपने मोबाइल डिवाइस से टीवी पर कॉन्टेंट कास्ट कर सकते हैं. आम तौर पर, Google Cast सेशन में दो कॉम्पोनेंट होते हैं — भेजने वाला और पाने वाला ऐप्लिकेशन. YouTube.com जैसी वेबसाइट या मोबाइल ऐप्लिकेशन जैसे भेजने वाले ऐप्लिकेशन, Cast रिसीवर ऐप्लिकेशन के वीडियो चलाने की प्रोसेस शुरू करते हैं और उसे कंट्रोल करते हैं. कास्ट किए जाने वाले ऐप्लिकेशन, HTML 5 ऐप्लिकेशन होते हैं. ये Chromecast और Android TV डिवाइसों पर चलते हैं.
कास्ट सेशन में मौजूद ज़्यादातर जानकारी, रिसीवर ऐप्लिकेशन में सेव की जाती है. जब स्थिति अपडेट होती है, तो उदाहरण के लिए, अगर कोई नया मीडिया आइटम लोड किया जाता है, तो ईमेल भेजने वाले सभी लोगों को मीडिया का स्टेटस ब्रॉडकास्ट किया जाता है. इन ब्रॉडकास्ट में, कास्ट सेशन की मौजूदा स्थिति शामिल होती है. मीडिया का स्टेटस भेजने वाले ऐप्लिकेशन, अपने यूज़र इंटरफ़ेस (यूआई) में प्लेबैक की जानकारी दिखाने के लिए इस स्टेटस का इस्तेमाल करते हैं.
Cast Connect, इस इन्फ़्रास्ट्रक्चर के आधार पर काम करता है. इसमें आपका Android TV ऐप्लिकेशन, रिसीवर के तौर पर काम करता है. Cast Connect लाइब्रेरी की मदद से, आपके Android TV ऐप्लिकेशन को मैसेज मिल सकते हैं. साथ ही, मीडिया की स्थिति को ब्रॉडकास्ट किया जा सकता है. ऐसा करने पर, यह ऐप्लिकेशन किसी Cast रिसीवर ऐप्लिकेशन की तरह काम करता है.
हम क्या बनाने जा रहे हैं?
इस कोडलैब को पूरा करने के बाद, Android TV ऐप्लिकेशन पर वीडियो कास्ट करने के लिए, Cast करने वाले ऐप्लिकेशन का इस्तेमाल किया जा सकेगा. Android TV ऐप्लिकेशन, Cast प्रोटोकॉल की मदद से, वीडियो भेजने वाले ऐप्लिकेशन के साथ भी कम्यूनिकेट कर सकता है.
आपको क्या सीखने को मिलेगा
- सैंपल ATV ऐप्लिकेशन में 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 की सुविधाएं चालू करने के लिए, आपको Cast Developer Console में, Android TV डिवाइस में पहले से मौजूद उस Chromecast के सीरियल नंबर को रजिस्टर करना होगा जिसका इस्तेमाल आपको करना है. सीरियल नंबर देखने के लिए, अपने Android TV पर सेटिंग > डिवाइस की सेटिंग > Chromecast बिल्ट-इन > सीरियल नंबर पर जाएं. ध्यान दें कि यह आपके डिवाइस के सीरियल नंबर से अलग है और इसे ऊपर बताए गए तरीके से लेना चाहिए.
पंजीकरण के बिना, 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 डिवाइस पर, डेवलपर के लिए सेटिंग और टूल और यूएसबी डीबग करने की सुविधा चालू करें.
- ADB को अपने Android TV डिवाइस से कनेक्ट करें. डिवाइस 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
सभी कास्ट इंटरैक्शन को सिंक करने के लिए सिंगलटन ऑब्जेक्ट है. 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.