यहां दी गई प्रोसेस की मदद से, Android सेंडर ऐप्लिकेशन को Cast SDK टूल के वर्शन 2 से सीएएफ़ सेंडर में बदला जा सकता है. यह CastContext सिंगलटन पर आधारित है.
Cast CAF Sender SDK, आपकी ओर से GoogleAPIClient को मैनेज करने के लिए CastContext का इस्तेमाल करता है. CastContext, आपके लिए लाइफ़साइकल, गड़बड़ियों, और कॉलबैक को मैनेज करता है. इससे Cast ऐप्लिकेशन को डेवलप करना काफ़ी आसान हो जाता है.
परिचय
- Android SDK मैनेजर का इस्तेमाल करके, CAF Sender को अब भी Google Play services के हिस्से के तौर पर उपलब्ध कराया जाता है
- नए पैकेज जोड़े गए हैं, जो Google Cast डिज़ाइन चेकलिस्ट (
com.google.android.gms.cast.framework.*) का पालन करने की ज़िम्मेदारी लेते हैं - CAF Sender, Cast के यूज़र एक्सपीरियंस की ज़रूरी शर्तों को पूरा करने वाले विजेट उपलब्ध कराता है. हालांकि, v2 में कोई यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट नहीं मिलता था और आपको ये विजेट लागू करने पड़ते थे.
- Cast API का इस्तेमाल करने के लिए, अब GoogleApiClient का इस्तेमाल करना ज़रूरी नहीं है.
- CAF सेंडर में सबटाइटल की सुविधा, v2 की तरह ही है.
डिपेंडेंसी
V2 और CAF, दोनों की सहायता लाइब्रेरी और Google Play services (9.2.0 या इसके बाद के वर्शन) पर एक जैसी डिपेंडेंसी होती हैं. इस बारे में सहायता लाइब्रेरी की सुविधाओं से जुड़ी गाइड में बताया गया है
CAF, Android SDK के कम से कम 9 (Gingerbread) वर्शन के साथ काम करता है.
डेटा लेयर में इवेंट बनाने की प्रोसेस
CAF में, Cast फ़्रेमवर्क को शुरू करने के लिए, साफ़ तौर पर एक चरण की ज़रूरत होती है. इसके लिए,
CastContext
सिंगलटन को शुरू करना होगा. इसके लिए, सही
OptionsProvider
का इस्तेमाल करके, वेब रिसीवर ऐप्लिकेशन आईडी और अन्य ग्लोबल विकल्प तय करें.
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}
ऐप्लिकेशन की AndroidManifest.xml फ़ाइल के "application" टैग में, OptionsProvider का एलान करें:
<application>
...
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>
हर गतिविधि के onCreate तरीके में, CastContext को लेज़ी तरीके से शुरू करें:
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
v2 में ये चरण ज़रूरी नहीं थे.
कास्ट की सुविधा वाले डिवाइस खोजना
सीएएफ़ में, डिवाइस खोजने की प्रोसेस फ़्रेमवर्क अपने-आप शुरू और बंद करता है. ऐसा तब होता है, जब ऐप्लिकेशन फ़ोरग्राउंड में आता है और बैकग्राउंड में जाता है. MediaRouteSelector और MediaRouter.Callback का इस्तेमाल नहीं किया जाना चाहिए.
कास्ट बटन और कास्ट डायलॉग
वर्शन 2 की तरह ही, ये कॉम्पोनेंट MediaRouter सहायता लाइब्रेरी से मिलते हैं.
कास्ट बटन को अब भी MediaRouteButton से लागू किया जाता है. इसे आपकी गतिविधि में, मेन्यू के आइटम के तौर पर जोड़ा जा सकता है. इसके लिए, ActionBar या Toolbar का इस्तेमाल किया जा सकता है.
<item
android:id="@+id/media_route_menu_item"
android:title="@string/media_route_menu_title"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>
MediaRouteButton को Cast फ़्रेमवर्क से जोड़ने के लिए, CastButtonFactory का इस्तेमाल करके हर ऐक्टिविटी के onCreateOptionMenu() तरीके को बदलें:
private MenuItem mediaRouteMenuItem;
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mediaRouteMenuItem =
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
जब कोई व्यक्ति इस बटन पर टैप करता है, तो कास्ट करने वाला डायलॉग बॉक्स अपने-आप दिखने लगता है.
डिवाइस कंट्रोल
CAF में, डिवाइस कंट्रोल को ज़्यादातर फ़्रेमवर्क मैनेज करता है. भेजने वाले ऐप्लिकेशन को डिवाइस से कनेक्ट करने और GoogleApiClient का इस्तेमाल करके वेब रिसीवर ऐप्लिकेशन को लॉन्च करने की ज़रूरत नहीं होती. साथ ही, उसे ऐसा करने की कोशिश भी नहीं करनी चाहिए. भेजने वाले और वेब रिसीवर के बीच होने वाले इंटरैक्शन को अब "सेशन" के तौर पर दिखाया जाता है. SessionManager
क्लास, सेशन लाइफ़साइकल को मैनेज करती है. साथ ही, उपयोगकर्ता के जेस्चर के हिसाब से, सेशन को अपने-आप शुरू और बंद करती है: जब उपयोगकर्ता, Cast डायलॉग में कोई Cast डिवाइस चुनता है, तो सेशन शुरू हो जाता है. वहीं, जब उपयोगकर्ता, Cast डायलॉग में "कास्ट करना बंद करें" बटन पर टैप करता है या जब सेंडर ऐप्लिकेशन खुद ही बंद हो जाता है, तो सेशन खत्म हो जाता है. SessionManager के साथ SessionManagerListener को रजिस्टर करके, सेशन के लाइफ़साइकल इवेंट की सूचना, भेजने वाले ऐप्लिकेशन को दी जा सकती है. SessionManagerListener कॉलबैक, सभी सेशन लाइफ़साइकल इवेंट के लिए कॉलबैक के तरीके तय करते हैं.
CastSession क्लास, Cast डिवाइस के साथ सेशन को दिखाती है. इस क्लास में, डिवाइस की आवाज़ को कंट्रोल करने और उसे म्यूट करने के तरीके मौजूद हैं. पहले, v2 में यह काम Cast.CastApi पर मौजूद तरीकों का इस्तेमाल करके किया जाता था.
v2 में,
Cast.Listener
कॉलबैक से डिवाइस की स्थिति में हुए बदलावों की सूचनाएं मिलती थीं. जैसे,
आवाज़, म्यूट की स्थिति, स्टैंडबाय की स्थिति वगैरह.
CAF में, आवाज़/म्यूट की स्थिति में बदलाव की सूचनाएं अब भी Cast.Listener में कॉलबैक के तरीकों से डिलीवर की जाती हैं; ये लिसनर CastSession के साथ रजिस्टर किए जाते हैं.
डिवाइस की स्थिति से जुड़ी बाकी सभी सूचनाएं, CastStateListener कॉलबैक के ज़रिए डिलीवर की जाती हैं. ये लिसनर, CastSession के साथ रजिस्टर होते हैं. पक्का करें कि जब उनसे जुड़े फ़्रैगमेंट, गतिविधियां या ऐप्लिकेशन बैकग्राउंड में जाएं, तब भी लिसनर का रजिस्ट्रेशन रद्द किया जाए.
फिर से कनेक्ट करने का लॉजिक
v2 की तरह ही, सीएएफ़ उन इंटरनेट कनेक्शन को फिर से चालू करने की कोशिश करता है जो वाई-फ़ाई सिग्नल के कुछ समय के लिए चले जाने या नेटवर्क की अन्य गड़बड़ियों की वजह से बंद हो जाते हैं. अब यह सेशन लेवल पर किया जाता है. कनेक्शन टूटने पर, सेशन "निलंबित" स्थिति में जा सकता है. साथ ही, कनेक्टिविटी वापस आने पर, यह "कनेक्ट किया गया" स्थिति में वापस आ जाएगा. फ़्रेमवर्क, वेब रिसीवर ऐप्लिकेशन से फिर से कनेक्ट करने और इस प्रोसेस के तहत, किसी भी कास्ट चैनल को फिर से कनेक्ट करने का ध्यान रखता है.
इसके अलावा, सीएएफ़ में सेशन अपने-आप फिर से शुरू होने की सुविधा भी जोड़ी गई है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसे CastOptions की मदद से बंद किया जा सकता है.
अगर कास्ट सेशन के दौरान, सेंडर ऐप्लिकेशन को बैकग्राउंड में भेज दिया जाता है या उसे बंद कर दिया जाता है (स्वाइप करके या क्रैश होने की वजह से), तो फ़्रेमवर्क उस सेशन को फिर से शुरू करने की कोशिश करेगा. ऐसा तब होगा, जब सेंडर ऐप्लिकेशन फ़ोरग्राउंड में वापस आएगा या फिर से लॉन्च किया जाएगा. इसे SessionManager अपने-आप मैनेज करता है. यह किसी भी रजिस्टर किए गए SessionManagerListener इंस्टेंस पर सही कॉलबैक जारी करेगा.
कस्टम चैनल का रजिस्ट्रेशन
v2 में, कस्टम चैनल (Cast.MessageReceivedCallback का इस्तेमाल करके लागू किए गए) Cast.CastApi के साथ रजिस्टर किए जाते हैं. CAF में, कस्टम चैनल CastSession इंस्टेंस के साथ रजिस्टर किए जाते हैं. रजिस्ट्रेशन,
SessionManagerListener.onSessionStarted
कॉलबैक के तरीके से किया जा सकता है. मीडिया ऐप्लिकेशन के लिए, अब Cast.CastApi.setMessageReceivedCallbacks के ज़रिए मीडिया कंट्रोल चैनल को साफ़ तौर पर रजिस्टर करना ज़रूरी नहीं है. ज़्यादा जानकारी के लिए, यहां मौजूद सेक्शन देखें.
मीडिया नियंत्रण
v2 क्लास
RemoteMediaPlayer
अब काम नहीं करती और इसका इस्तेमाल नहीं किया जाना चाहिए. CAF में, इसकी जगह नई
RemoteMediaClient
क्लास का इस्तेमाल किया जाता है. यह क्लास, ज़्यादा सुविधाजनक एपीआई में मिलती-जुलती सुविधाएं उपलब्ध कराती है. इस ऑब्जेक्ट को साफ़ तौर पर शुरू या रजिस्टर करने की ज़रूरत नहीं है. अगर कनेक्ट किया जा रहा वेब रिसीवर ऐप्लिकेशन, मीडिया नेमस्पेस के साथ काम करता है, तो सेशन शुरू होने पर फ़्रेमवर्क, ऑब्जेक्ट को अपने-आप इंस्टैंशिएट कर देगा और मीडिया चैनल को रजिस्टर कर देगा.
RemoteMediaClient को CastSession ऑब्जेक्ट के getRemoteMediaClient तरीके के तौर पर ऐक्सेस किया जा सकता है.
वर्शन 2 में, RemoteMediaPlayer पर किए गए सभी मीडिया अनुरोध, PendingResult कॉलबैक के ज़रिए RemoteMediaPlayer.MediaChannelResult दिखाएंगे.
CAF में, RemoteMediaClient पर जारी किए गए सभी मीडिया अनुरोध, PendingResult कॉलबैक के ज़रिए RemoteMediaClient.MediaChannelResult दिखाते हैं. इसका इस्तेमाल, अनुरोध की प्रोग्रेस और आखिरी नतीजे को ट्रैक करने के लिए किया जा सकता है.
v2 RemoteMediaPlayer, RemoteMediaPlayer.OnStatusUpdatedListener के ज़रिए वेब रिसीवर पर मीडिया प्लेयर की स्थिति में हुए बदलावों के बारे में सूचनाएं भेजेगा.
CAF में, RemoteMediaClient अपने RemoteMediaClient.Listener इंटरफ़ेस के ज़रिए, मिलते-जुलते कॉलबैक उपलब्ध कराता है. RemoteMediaClient के साथ कितने भी लिसनर रजिस्टर किए जा सकते हैं. इससे, भेजने वाले कई कॉम्पोनेंट, सेशन से जुड़े RemoteMediaClient के सिंगल इंस्टेंस को शेयर कर सकते हैं.
v2 में, भेजने वाले ऐप्लिकेशन को वेब रिसीवर पर मीडिया प्लेयर की स्थिति के साथ यूज़र इंटरफ़ेस को सिंक में रखने की ज़िम्मेदारी लेनी पड़ती थी.
CAF में, क्लास
UIMediaController
इस ज़िम्मेदारी का ज़्यादातर हिस्सा लेती है.
शुरुआती ओवरले
V2 में, ओवरले यूज़र इंटरफ़ेस (यूआई) के बारे में जानकारी नहीं दी जाती.
CAF, कस्टम व्यू
IntroductoryOverlay
उपलब्ध कराता है. इससे, उपयोगकर्ताओं को पहली बार कास्ट बटन दिखाए जाने पर, उसे हाइलाइट किया जा सकता है.
मिनी कंट्रोलर
v2 में, आपको सेंडर ऐप्लिकेशन में मिनी कंट्रोलर को नए सिरे से लागू करना होगा.
CAF में, SDK टूल एक कस्टम व्यू, MiniControllerFragment उपलब्ध कराता है. इसे उन गतिविधियों की ऐप्लिकेशन लेआउट फ़ाइल में जोड़ा जा सकता है जिनमें आपको मिनी कंट्रोलर दिखाना है.
सूचना और लॉक स्क्रीन
v2 में, सूचना और लॉक स्क्रीन के लिए कंट्रोलर, एसडीके से नहीं मिलते. उस SDK टूल के लिए, आपको Android फ़्रेमवर्क एपीआई का इस्तेमाल करके, ये सुविधाएं अपने सेंडर ऐप्लिकेशन में बनानी होंगी.
CAF में, एसडीके आपको NotificationsOptions.Builder उपलब्ध कराता है. इससे आपको सेंडर ऐप्लिकेशन में, सूचना और लॉक स्क्रीन के लिए मीडिया कंट्रोल बनाने में मदद मिलती है. CastContext को शुरू करते समय, CastOptions की मदद से सूचना और लॉक स्क्रीन कंट्रोल चालू किए जा सकते हैं.
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setTargetActivityClassName(VideoBrowserActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
बड़ा किया गया कंट्रोलर
v2 में, आपको भेजने वाले ऐप्लिकेशन में, बड़ा किया गया कंट्रोलर शुरू से लागू करना होगा.
CAF, UIMediaController हेल्पर क्लास उपलब्ध कराता है. इससे आपको अपना बड़ा कंट्रोलर बनाने में आसानी होती है.
CAF, पहले से तैयार किया गया बड़ा कंट्रोलर विजेट जोड़ता है
ExpandedControllerActivity
जिसे आसानी से अपने ऐप्लिकेशन में जोड़ा जा सकता है. अब आपको UIMediaController का इस्तेमाल करके, पसंद के मुताबिक बड़ा कंट्रोलर लागू करने की ज़रूरत नहीं है.
ऑडियो फ़ोकस
वर्शन 2 में, ऑडियो फ़ोकस को मैनेज करने के लिए, आपको MediaSessionCompat का इस्तेमाल करना होगा.
सीएएफ़ में, ऑडियो फ़ोकस अपने-आप मैनेज होता है.
डीबग लॉग
CAF में लॉग इन करने का कोई विकल्प नहीं है.
सैंपल के तौर पर मिले ऐप्लिकेशन
हमारे पास कोडलैब ट्यूटोरियल और सैंपल के तौर पर मिले ऐप्लिकेशन हैं जो सीएएफ़ का इस्तेमाल करते हैं.