नीचे दी गई प्रोसेस से, Android डिवाइस पर मौजूद सेंडर ऐप्लिकेशन को Cast SDK v2 से CAF Sender में बदला जा सकता है. यह CastContext सिंगलटन पर आधारित है.
Cast CAF Sender SDK, CastContext का इस्तेमाल करके आपकी ओर से GoogleAPIClient को मैनेज करता है. CastContext, आपके लिए लाइफ़साइकल, गड़बड़ियों, और कॉलबैक को मैनेज करता है. इससे कास्ट ऐप्लिकेशन को डेवलप करना बहुत आसान हो जाता है.
परिचय
- CAF Sender को अब भी Android SDK Manager का इस्तेमाल करके, Google Play services के हिस्से के तौर पर डिस्ट्रिब्यूट किया जाता है
- नए पैकेज जोड़े गए हैं, जो Google Cast के डिज़ाइन की चेकलिस्ट (
com.google.android.gms.cast.framework.*) का पालन करने की ज़िम्मेदारी लेते हैं - CAF Sender, ऐसे विजेट उपलब्ध कराता है जो Cast UX की ज़रूरी शर्तों का पालन करते हैं; v2 में कोई यूआई कॉम्पोनेंट उपलब्ध नहीं कराया गया था. इसलिए, आपको इन विजेट को लागू करना पड़ता था.
- Cast API का इस्तेमाल करने के लिए, अब GoogleApiClient का इस्तेमाल करना ज़रूरी नहीं है.
- CAF Sender में सबटाइटल की सुविधा, v2 की तरह ही होती है.
डिपेंडेंसी
V2 और CAF, दोनों के लिए सपोर्ट लाइब्रेरी और Google Play services (9.2.0 या इसके बाद का वर्शन) की एक जैसी डिपेंडेंसी होती हैं. इनके बारे में सपोर्ट लाइब्रेरी की सुविधाओं से जुड़ी गाइड में बताया गया है
CAF के साथ काम करने वाला Android SDK का सबसे पुराना वर्शन 9 (Gingerbread) है.
डेटा लेयर में इवेंट बनाने की प्रोसेस
CAF में, Cast फ़्रेमवर्क के लिए, साफ़ तौर पर इनिशियलाइज़ेशन का चरण ज़रूरी है. इसमें CastContext सिंगलटन को शुरू करना शामिल है. साथ ही, Web Receiver ऐप्लिकेशन आईडी और अन्य ग्लोबल विकल्पों के बारे में बताने के लिए, सही 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 में इन चरणों को पूरा करना ज़रूरी नहीं था.
कास्ट की सुविधा वाले डिवाइस खोजना
CAF में, ऐप्लिकेशन के फ़ोरग्राउंड में आने पर डिवाइस ढूंढने की प्रोसेस अपने-आप शुरू हो जाती है. साथ ही, ऐप्लिकेशन के बैकग्राउंड में जाने पर यह प्रोसेस अपने-आप बंद हो जाती है. MediaRouteSelector और MediaRouter.Callback का इस्तेमाल नहीं किया जाना चाहिए.
कास्ट बटन और कास्ट डायलॉग
वर्शन 2 की तरह ही, ये कॉम्पोनेंट MediaRouter support library से मिलते हैं.
कास्ट बटन अब भी 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"/>
onCreateOptionMenu() का इस्तेमाल करके, हर ऐक्टिविटी के onCreateOptionMenu() तरीके को बदलें. साथ ही, MediaRouteButton को Cast फ़्रेमवर्क से जोड़ने के लिए, CastButtonFactory का इस्तेमाल करें:
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 क्लास, सेशन के लाइफ़साइकल को मैनेज करती है. साथ ही, उपयोगकर्ता के जेस्चर के जवाब में सेशन को अपने-आप शुरू और बंद करती है: सेशन तब शुरू होता है, जब उपयोगकर्ता कास्ट डायलॉग में कास्ट डिवाइस चुनता है. सेशन तब खत्म होता है, जब उपयोगकर्ता कास्ट डायलॉग में "कास्ट करना बंद करें" बटन पर टैप करता है या जब भेजने वाला ऐप्लिकेशन खुद बंद हो जाता है. भेजने वाले ऐप्लिकेशन को सेशन के लाइफ़साइकल इवेंट के बारे में सूचना दी जा सकती है. इसके लिए, SessionManager के साथ SessionManagerListener रजिस्टर करें. SessionManagerListener कॉलबैक, सेशन के लाइफ़साइकल के सभी इवेंट के लिए कॉलबैक के तरीके तय करते हैं.
CastSession क्लास, कास्ट डिवाइस के साथ सेशन को दिखाता है. इस क्लास में, डिवाइस की आवाज़ और म्यूट करने की स्थितियों को कंट्रोल करने के तरीके हैं. पहले, v2 में Cast.CastApi पर मौजूद तरीकों का इस्तेमाल करके ऐसा किया जाता था.
v2 में, Cast.Listener कॉलबैक, डिवाइस की स्थिति में होने वाले बदलावों की सूचनाएं देते थे. इनमें वॉल्यूम, म्यूट करने की स्थिति, स्टैंडबाय स्टेटस वगैरह शामिल हैं.
CAF में, वॉल्यूम/म्यूट की स्थिति में बदलाव होने की सूचनाएं अब भी Cast.Listener में कॉलबैक
तरीकों के ज़रिए दी जाती हैं. ये लिसनर, CastSession के साथ रजिस्टर किए जाते हैं.
डिवाइस की स्थिति से जुड़ी बाकी सभी सूचनाएं, CastStateListener कॉलबैक के ज़रिए भेजी जाती हैं. ये लिसनर, CastSession के साथ रजिस्टर किए जाते हैं. पक्का करें कि इससे जुड़े फ़्रैगमेंट, गतिविधियां या ऐप्लिकेशन बैकग्राउंड में जाने पर, लिसनर को अब भी अनरजिस्टर किया जा रहा हो.
फिर से कनेक्ट करने का लॉजिक
v2 की तरह ही, CAF भी उन नेटवर्क कनेक्शन को फिर से चालू करने की कोशिश करता है जो वाई-फ़ाई सिग्नल के कुछ समय के लिए बंद होने या नेटवर्क से जुड़ी अन्य गड़बड़ियों की वजह से बंद हो जाते हैं. अब यह काम सेशन लेवल पर किया जाता है. कनेक्शन टूट जाने पर, सेशन "निलंबित" स्थिति में आ सकता है. कनेक्टिविटी वापस आने पर, यह "कनेक्ट किया गया" स्थिति में वापस आ जाएगा. इस प्रोसेस के दौरान, फ़्रेमवर्क Web Receiver ऐप्लिकेशन से फिर से कनेक्ट होने और किसी भी Cast चैनल को फिर से कनेक्ट करने का ध्यान रखता है.
इसके अलावा, CAF में सेशन अपने-आप फिर से शुरू होने की सुविधा भी जोड़ी गई है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसे CastOptions के ज़रिए बंद किया जा सकता है.
अगर कास्ट सेशन के दौरान, भेजने वाले ऐप्लिकेशन को बैकग्राउंड में भेज दिया जाता है या बंद कर दिया जाता है (स्வைப் करके या क्रैश होने की वजह से), तो फ़्रेमवर्क उस सेशन को फिर से शुरू करने की कोशिश करेगा. ऐसा तब होगा, जब भेजने वाला ऐप्लिकेशन फ़ोरग्राउंड में वापस आ जाएगा या उसे फिर से लॉन्च किया जाएगा. इसे SessionManager अपने-आप मैनेज करता है. यह रजिस्टर किए गए किसी भी SessionManagerListener इंस्टेंस पर सही कॉलबैक जारी करेगा.
कस्टम चैनल का रजिस्ट्रेशन
दूसरे वर्शन में, कस्टम चैनल (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, उपयोगकर्ताओं को पहली बार Cast बटन दिखाए जाने पर, उसे हाइलाइट करने के लिए कस्टम व्यू
IntroductoryOverlay उपलब्ध कराता है.
मिनी कंट्रोलर
v2 में, आपको सेंडर ऐप्लिकेशन में स्क्रैच से मिनी कंट्रोलर लागू करना होगा.
CAF में, एसडीके एक कस्टम व्यू 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 का इस्तेमाल करके, कस्टम बड़ा कंट्रोलर लागू करने की ज़रूरत नहीं है.
ऑडियो फ़ोकस
v2 में, ऑडियो फ़ोकस को मैनेज करने के लिए MediaSessionCompat का इस्तेमाल करना होगा.
CAF में, ऑडियो फ़ोकस को अपने-आप मैनेज किया जाता है.
डीबग लॉगिंग
CAF में लॉगिंग के कोई विकल्प नहीं होते.
सैंपल ऐप्लिकेशन
हमारे पास CAF का इस्तेमाल करने वाले कोडलैब ट्यूटोरियल और सैंपल ऐप्लिकेशन हैं.