1. खास जानकारी
यह कोडलैब आपको मौजूदा Android TV ऐप्लिकेशन में बदलाव करने का तरीका बताएगा, ताकि कास्ट करने वाले मौजूदा ऐप्लिकेशन से कास्ट करने और बातचीत करने की सुविधा मिल सके.
Google Cast और Cast Connect क्या है?
Google Cast, उपयोगकर्ताओं को मोबाइल डिवाइस से टीवी पर कॉन्टेंट कास्ट करने की सुविधा देता है. आम तौर पर Google Cast सेशन में दो कॉम्पोनेंट होते हैं — भेजने वाले का नाम और रिसीवर ऐप्लिकेशन. भेजने वाले ऐप्लिकेशन, जैसे कि मोबाइल ऐप्लिकेशन या वेबसाइट जैसे YouTube.com, Cast रिसीवर ऐप्लिकेशन को चलाने की सुविधा देते हैं और उसे कंट्रोल करते हैं. कास्ट किए जाने वाले ऐप्लिकेशन, HTML 5 ऐप्लिकेशन होते हैं. ये Chromecast और Android TV डिवाइसों पर चलते हैं.
कास्ट सेशन की करीब-करीब पूरी स्थिति, रिसीवर ऐप्लिकेशन पर सेव होती है. जब स्टेटस अपडेट होता है, तो ईमेल भेजने वाले सभी लोगों को मीडिया स्टेटस ब्रॉडकास्ट होता है. जैसे, कोई नया मीडिया आइटम लोड होने पर. इन ब्रॉडकास्ट में कास्ट सेशन की मौजूदा स्थिति देखी जा सकती है. भेजने वाले ऐप्लिकेशन इस मीडिया स्थिति का इस्तेमाल, अपने यूज़र इंटरफ़ेस (यूआई) में प्लेबैक की जानकारी दिखाने के लिए करते हैं.
Cast Connect इस इंफ़्रास्ट्रक्चर में सबसे ऊपर बनता है. इसमें आपका Android TV ऐप्लिकेशन, रिसीवर की तरह काम करता है. Cast Connect लाइब्रेरी की मदद से आपका Android TV ऐप्लिकेशन, मैसेज और ब्रॉडकास्ट मीडिया का स्टेटस देख सकता है. ऐसा करके, वह किसी कास्ट रिसीवर ऐप्लिकेशन की तरह ही कास्ट करता है.
हम क्या बनाने जा रहे हैं?
इस कोडलैब को पूरा करने के बाद, किसी Android TV ऐप्लिकेशन पर वीडियो कास्ट करने के लिए, कास्ट करने वाले ऐप्लिकेशन का इस्तेमाल किया जा सकेगा. कास्ट प्रोटोकॉल की मदद से भी Android TV ऐप्लिकेशन, कॉन्टेंट भेजने वाले ऐप्लिकेशन से बातचीत कर सकता है.
आपको क्या सीखने को मिलेगा
- 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 की सुविधाएं चालू करने के लिए, आपको Android TV डिवाइस में पहले से मौजूद Chromecast का सीरियल नंबर रजिस्टर करना होगा. इसका इस्तेमाल Cast Developer Console में किया जाएगा. सीरियल नंबर ढूंढने के लिए, Settings > पर जाएं डिवाइस की सेटिंग > Chromecast बिल्ट-इन > आपके Android TV पर सीरियल नंबर. ध्यान दें कि यह आपके डिवाइस के सीरियल नंबर से अलग है और इसे ऊपर बताए गए तरीके से लेना चाहिए.
पंजीकरण के बिना, 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 में दिखना चाहिए.
- Run बटन पर क्लिक करने के बाद, आपको कुछ सेकंड के बाद Cast Connect कोडलैब नाम का एटीवी ऐप्लिकेशन दिखेगा.
Cast Connect with ATV ऐप्लिकेशन चलाएं
- Android TV की होम स्क्रीन पर जाएं.
- अपने Android फ़ोन पर, Cast वीडियो भेजने वाले व्यक्ति का ऐप्लिकेशन खोलें. 'कास्ट करें' बटन पर क्लिक करें और अपना ATV डिवाइस चुनें.
- आपके ATV पर Cast Connect कोडलैब 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 सेवाओं के नए वर्शन का इस्तेमाल करता है. इनके लिए, AndroidX नेमस्पेस का इस्तेमाल करने के लिए, आपके ATV ऐप्लिकेशन को अपडेट करना ज़रूरी है.
अपने 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
, सभी कास्ट इंटरैक्शन को सिंक करने के लिए सिंगलटन ऑब्जेक्ट है. 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
को बंद करना चाहिए. हमारा सुझाव है कि कॉल करने की प्रक्रिया को मैनेज करने के लिए, androidx.lifecycle लाइब्रेरी से LifecycleObserver
का इस्तेमाल करें CastReceiverContext.start()
और CastReceiverContext.stop()
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 डिवाइस पर ऐप्लिकेशन को डिप्लॉय करने के लिए, Run बटन पर क्लिक करें. इसके बाद, ऐप्लिकेशन को बंद करें और 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 डिवाइस पर 'रोकें', 'वीडियो रोकें' जैसे कंट्रोल इस्तेमाल करें.
7. कास्ट कंट्रोल करने के निर्देश देने की सुविधा काम करती है
मौजूदा ऐप्लिकेशन अब उन बेसिक कमांड के साथ काम करता है जो मीडिया सेशन के साथ काम करते हैं. जैसे, चलाना, रोकना, और खोजना. हालांकि, कास्ट कंट्रोल के कुछ ऐसे निर्देश हैं जो मीडिया सेशन में उपलब्ध नहीं हैं. कास्ट कंट्रोल करने के ये निर्देश काम कर सकें, इसके लिए आपको MediaCommandCallback
रजिस्टर करना होगा.
प्लेयर के शुरू होने पर setMediaCommandCallback
का इस्तेमाल करके, MediaManager
इंस्टेंस में MyMediaCommandCallback
जोड़ें:
private fun initializePlayer() {
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager = castReceiverContext!!.mediaManager
...
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
}
}
तरीके बदलने के लिए, MyMediaCommandCallback
क्लास बनाएं. जैसे, 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
})
}
}
बाहर भेजने से पहले MediaStatus में रुकावट डालना
वेब रिसीवर SDK टूल के MessageInterceptor
की तरह ही, अपने MediaStatus
में अतिरिक्त बदलाव करने के लिए, MediaManager
में MediaStatusWriter
तय किया जा सकता है. ऐसा, कनेक्ट किए गए ईमेल पतों पर ब्रॉडकास्ट करने से पहले किया जा सकता है.
उदाहरण के लिए, मोबाइल ईमेल भेजने वालों को मैसेज भेजने से पहले, 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.