1. खास जानकारी
यह कोडलैब आपको किसी मौजूदा Android TV ऐप्लिकेशन में बदलाव करने का तरीका बताएगा, ताकि कास्ट करने वाले अपने मौजूदा ऐप्लिकेशन से कास्ट करने और उनसे संपर्क करने की सुविधा काम कर सके.
Google Cast और Cast Connect क्या है?
Google Cast, उपयोगकर्ताओं को मोबाइल डिवाइस से टीवी पर कॉन्टेंट को कास्ट करने की सुविधा देता है. Google Cast के सामान्य सेशन में दो कॉम्पोनेंट होते हैं — भेजने वाला और पाने वाला ऐप्लिकेशन. सेंडर ऐप्लिकेशन, जैसे कि मोबाइल ऐप्लिकेशन या YouTube.com वेबसाइट, कास्ट किए जाने वाले ऐप्लिकेशन को चलाना शुरू करते हैं और उसे कंट्रोल करते हैं. कास्ट किए जाने वाले ऐप्लिकेशन, HTML 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 ऐप्लिकेशन, बेसिक यूज़र इंटरफ़ेस (यूआई) और बेसिक वीडियो प्लेयर का इस्तेमाल करता है. उपयोगकर्ता सूची से वीडियो चुन सकता है, जो उसके चुने जाने पर टीवी पर चलता है. साथ में दिए गए मोबाइल सेंडर ऐप्लिकेशन की मदद से, उपयोगकर्ता Android TV ऐप्लिकेशन पर वीडियो भी कास्ट कर सकता है.
डेवलपर डिवाइसों को रजिस्टर करें
ऐप्लिकेशन डेवलप करने के लिए, Cast Connect की क्षमताओं को चालू करने के लिए, आपको Android TV डिवाइस में पहले से मौजूद उस Chromecast का सीरियल नंबर रजिस्टर करना होगा जिसे आप Cast Developer Console में इस्तेमाल करने वाले हैं. सीरियल नंबर जानने के लिए, अपने 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
डायरेक्ट्री चुनें और 'ठीक है' पर क्लिक करें. - फ़ाइल > Grdle Files के साथ प्रोजेक्ट सिंक करें पर क्लिक करें.
- अपने Android TV डिवाइस पर, डेवलपर के लिए सेटिंग और टूल को चुनने और यूएसबी डीबग करने की सुविधा चालू करें.
- अपने Android TV डिवाइस से ADB कनेक्ट करें. यह डिवाइस Android Studio में दिखना चाहिए.
- रन करें बटन पर क्लिक करें. कुछ सेकंड बाद, आपको Cast Connect Codelab नाम का ATV ऐप्लिकेशन दिखेगा.
आइए, ATV ऐप्लिकेशन की मदद से Cast Connect को चलाएं
- Android TV की होम स्क्रीन पर जाएं.
- अपने Android फ़ोन से, कास्ट वीडियो भेजने वाले ऐप्लिकेशन को खोलें. 'कास्ट करें' बटन पर क्लिक करें और अपना एटीवी डिवाइस चुनें.
- आपके ATV पर Cast Connect Codelab ATV ऐप्लिकेशन लॉन्च हो जाएगा. साथ ही, मैसेज भेजने वाले व्यक्ति की स्क्रीन पर दिख रहे 'कास्ट करें' बटन से पता चलेगा कि इस ऐप्लिकेशन को से कनेक्ट कर दिया गया है.
- ATV ऐप्लिकेशन से कोई वीडियो चुनें और वीडियो आपके एटीवी पर चलने लगेगा.
- मोबाइल फ़ोन पर, मैसेज भेजने वाले ऐप्लिकेशन के सबसे नीचे, अब एक मिनी कंट्रोलर दिखेगा. वीडियो चलाने की सुविधा को कंट्रोल करने के लिए, 'चलाएं/रोकें' बटन का इस्तेमाल किया जा सकता है.
- मोबाइल फ़ोन से कोई वीडियो चुनें और चलाएं. वीडियो आपके एटीवी पर चलने लगेगा और बड़ा किया गया कंट्रोलर आपके मोबाइल से भेजने वाले पर दिखाई देगा.
- अपना फ़ोन लॉक करें और अनलॉक करने पर, आपको लॉक स्क्रीन पर मीडिया प्लेबैक को कंट्रोल करने या कास्ट करना बंद करने के लिए एक सूचना दिखेगी.
4. शुरुआती प्रोजेक्ट तैयार करना
हमने ऐप्लिकेशन के Cast Connect इंटिग्रेशन की पुष्टि कर ली है. अब हमें आपके डाउनलोड किए गए शुरुआती ऐप्लिकेशन से Cast Connect के लिए सहायता जोड़ने की ज़रूरत है. अब आप Android Studio का इस्तेमाल करके, स्टार्टर प्रोजेक्ट बनाने के लिए तैयार हैं:
- स्वागत स्क्रीन पर प्रोजेक्ट इंपोर्ट करें चुनें या फ़ाइल > नया > प्रोजेक्ट इंपोर्ट करें... मेन्यू विकल्प चुनें.
- सैंपल कोड फ़ोल्डर से,
app-start
डायरेक्ट्री चुनें और 'ठीक है' पर क्लिक करें. - फ़ाइल > Grdle Files के साथ प्रोजेक्ट सिंक करें पर क्लिक करें.
- एटीवी डिवाइस चुनें और ऐप्लिकेशन चलाने और यूज़र इंटरफ़ेस (यूआई) एक्सप्लोर करने के लिए, रन बटन पर क्लिक करें.
ऐप डिज़ाइन
यह ऐप्लिकेशन, उपयोगकर्ता को ब्राउज़ करने के लिए वीडियो की सूची उपलब्ध कराता है. लोग Android TV पर चलाने के लिए किसी वीडियो को चुन सकते हैं. ऐप्लिकेशन में दो मुख्य गतिविधियां हैं: MainActivity
और PlaybackActivity
.
MainActivity
इस गतिविधि में एक फ़्रैगमेंट (MainFragment
) है. वीडियो की सूची और उनसे जुड़े मेटाडेटा को MovieList
क्लास में कॉन्फ़िगर किया जाता है. setupMovies()
तरीके का इस्तेमाल, Movie
ऑब्जेक्ट की सूची बनाने के लिए किया जाता है.
Movie
ऑब्जेक्ट किसी वीडियो इकाई को दिखाता है. इसमें शीर्षक, जानकारी, पसंदीदा इमेज, और वीडियो यूआरएल शामिल है. वीडियो थंबनेल को टाइटल और स्टूडियो के साथ प्रज़ेंट करने के लिए, हर Movie
ऑब्जेक्ट CardPresenter
से जुड़ा होता है. इसके बाद, इसे ArrayObjectAdapter
को भेजा जाता है.
जब कोई आइटम चुना जाता है, तो उससे जुड़ा Movie
ऑब्जेक्ट PlaybackActivity
को पास कर दिया जाता है.
PlaybackActivity
इस गतिविधि में एक फ़्रैगमेंट (PlaybackVideoFragment
) है, जो चुने गए वीडियो की जानकारी दिखाने के लिए ExoPlayer
के साथ VideoView
, कुछ मीडिया कंट्रोल, और टेक्स्ट एरिया होस्ट करता है. साथ ही, उपयोगकर्ता को Android TV पर वीडियो चलाने की सुविधा देता है. उपयोगकर्ता वीडियो चलाने/रोकने या उन्हें चलाने के लिए, रिमोट कंट्रोल का इस्तेमाल कर सकता है.
Cast Connect से जुड़ी ज़रूरी शर्तें
Cast Connect, Google Play services के ऐसे नए वर्शन का इस्तेमाल करता है जिनमें AndroidX नेमस्पेस का इस्तेमाल करने के लिए, आपके ATV ऐप्लिकेशन को अपडेट करना ज़रूरी होता है.
अपने 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 ऐप्लिकेशन लॉन्च हो गया है और 'कास्ट करें' बटन कनेक्ट है.
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 डिवाइस चुनें. एटीवी ऐप्लिकेशन को एटीवी डिवाइस पर लॉन्च किया जाएगा. मोबाइल पर कोई वीडियो चुनें. वह वीडियो एटीवी पर चलने लगेगा. देखें कि क्या आपको अपने फ़ोन पर वीडियो चलाने की सुविधा की सूचना मिल रही है. एटीवी डिवाइस पर वीडियो रोकने और रोकने जैसे कंट्रोल इस्तेमाल करके देखें.
7. कास्ट कंट्रोल के निर्देश इस्तेमाल करने की सुविधा
मौजूदा ऐप्लिकेशन अब उन बुनियादी निर्देशों का इस्तेमाल करता है जो मीडिया सेशन के साथ काम करते हैं, जैसे कि चलाएं, रोकें, और आगे बढ़ें. हालांकि, कास्ट कंट्रोल करने के कुछ ऐसे निर्देश हैं जो मीडिया सेशन में उपलब्ध नहीं हैं. आपको उन कास्ट कंट्रोल के निर्देशों के साथ काम करने के लिए, एक MediaCommandCallback
को रजिस्टर करना होगा.
प्लेयर के शुरू होने पर setMediaCommandCallback
का इस्तेमाल करके, MyMediaCommandCallback
को MediaManager
इंस्टेंस में जोड़ें:
private fun initializePlayer() {
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager = castReceiverContext!!.mediaManager
...
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
}
}
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
की तरह ही, कनेक्ट किए गए ईमेल पतों पर ब्रॉडकास्ट होने से पहले, 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.