यहां दिया गया तरीका अपनाकर, अपने Android sender ऐप्लिकेशन को Cast SDK v2 से CAF Sender में बदला जा सकता है. यह ऐप्लिकेशन, CastContext सिंगलटन पर आधारित होता है.
Cast CAF Sender SDK, आपकी ओर से GoogleAPIClient को मैनेज करने के लिए CastContext का इस्तेमाल करता है. CastContext आपके लिए लाइफ़साइकल, गड़बड़ियां, और कॉलबैक मैनेज करता है. इससे, Cast ऐप्लिकेशन को डेवलप करना काफ़ी आसान हो जाता है.
परिचय
- CAF Sender अब भी Google Play services के हिस्से के तौर पर उपलब्ध है. इसके लिए, Android SDK मैनेजर का इस्तेमाल किया जाता है
- नए पैकेज जोड़े गए हैं, जो Google Cast डिज़ाइन की चेकलिस्ट (
com.google.android.gms.cast.framework.*
) का पालन करने की ज़िम्मेदारी लेते हैं - CAF Sender, ऐसे विजेट उपलब्ध कराता है जो Cast के यूज़र एक्सपीरियंस की ज़रूरी शर्तों को पूरा करते हैं. v2 में कोई यूज़र इंटरफ़ेस कॉम्पोनेंट नहीं दिया गया था और आपको ये विजेट लागू करने की ज़रूरत थी.
- Cast API का इस्तेमाल करने के लिए, अब GoogleApiClient का इस्तेमाल करना ज़रूरी नहीं है.
- CAF Sender में सबटाइटल की सुविधा, 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);
}
वर्शन 2 में, ये चरण ज़रूरी नहीं थे.
कास्ट की सुविधा वाले डिवाइस खोजना
CAF में, ऐप्लिकेशन के फ़ोरग्राउंड और बैकग्राउंड में जाने पर, फ़्रेमवर्क डिस्कवरी प्रोसेस को अपने-आप शुरू और बंद करता है. MediaRouteSelector
और MediaRouter.Callback
का इस्तेमाल नहीं किया जाना चाहिए.
कास्ट बटन और कास्ट डायलॉग
v2 की तरह ही, ये कॉम्पोनेंट 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 डायलॉग में "Cast करना बंद करें" बटन पर टैप करता है या जब भेजने वाला ऐप्लिकेशन अपने-आप बंद हो जाता है, तो सेशन खत्म हो जाता है. SessionManager
के साथ SessionManagerListener
को रजिस्टर करके, सेशन के लाइफ़साइकल इवेंट की सूचना, ईमेल भेजने वाले ऐप्लिकेशन को दी जा सकती है. SessionManagerListener
कॉलबैक, सेशन के लाइफ़साइकल के सभी इवेंट के लिए कॉलबैक के तरीके तय करते हैं.
CastSession
क्लास, Cast डिवाइस के साथ किसी सेशन को दिखाती है. इस क्लास में, डिवाइस के वॉल्यूम और म्यूट की स्थिति को कंट्रोल करने के तरीके हैं. पहले, Cast.CastApi
पर मौजूद तरीकों का इस्तेमाल करके, v2 में ऐसा किया जाता था.
v2 में, Cast.Listener
कॉलबैक की मदद से, डिवाइस की स्थिति में होने वाले बदलावों की सूचनाएं मिलती थीं. जैसे, वॉल्यूम, म्यूट की स्थिति, स्टैंडबाय की स्थिति वगैरह.
CAF में, वॉल्यूम/म्यूट की स्थिति में हुए बदलाव की सूचनाएं अब भी Cast.Listener
में कॉलबैक तरीकों से डिलीवर की जाती हैं. ये ऑडियंस, CastSession
के साथ रजिस्टर होती हैं.
डिवाइस की स्थिति से जुड़ी बाकी सभी सूचनाएं, CastStateListener
कॉलबैक के ज़रिए डिलीवर की जाती हैं. ये कॉलबैक, CastSession
के साथ रजिस्टर किए जाते हैं. पक्का करें कि जब भी जुड़े हुए फ़्रैगमेंट, गतिविधियां या ऐप्लिकेशन बैकग्राउंड में जाएं, तब भी आपने लिसनर को अनरजिस्टर कर दिया हो.
फिर से कनेक्ट करने का लॉजिक
v2 की तरह ही, CAF उन नेटवर्क कनेक्शन को फिर से कनेक्ट करने की कोशिश करता है जो वाई-फ़ाई सिग्नल के कुछ समय के लिए बंद होने या नेटवर्क से जुड़ी अन्य गड़बड़ियों की वजह से टूट जाते हैं. अब इसे सेशन लेवल पर किया जाता है. कनेक्शन टूटने पर, सेशन "निलंबित" स्थिति में जा सकता है. कनेक्शन वापस आने पर, सेशन फिर से "कनेक्टेड" स्थिति में आ जाएगा. फ़्रेमवर्क, इस प्रोसेस के तहत वेब रिसीवर ऐप्लिकेशन से फिर से कनेक्ट होने और किसी भी Cast चैनल से फिर से कनेक्ट होने की सुविधा देता है.
इसके अलावा, सीएफ़ में सेशन अपने-आप फिर से शुरू होने की सुविधा भी जोड़ी जाती है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसे CastOptions
की मदद से बंद किया जा सकता है.
अगर Cast सेशन चलने के दौरान, भेजने वाले ऐप्लिकेशन को बैकग्राउंड में भेजा जाता है या उसे बंद कर दिया जाता है (स्वाइप करके या क्रैश होने की वजह से), तो फ़्रेमवर्क उस सेशन को फिर से शुरू करने की कोशिश करेगा. ऐसा तब होगा, जब भेजने वाला ऐप्लिकेशन फ़ोरग्राउंड में वापस आएगा या उसे फिर से लॉन्च किया जाएगा. यह काम SessionManager
अपने-आप करता है. यह किसी भी रजिस्टर किए गए SessionManagerListener
इंस्टेंस पर सही कॉलबैक जारी करेगा.
कस्टम चैनल के लिए रजिस्ट्रेशन
वर्शन 2 में, Cast.MessageReceivedCallback
का इस्तेमाल करके लागू किए गए कस्टम चैनल, Cast.CastApi
के साथ रजिस्टर किए जाते हैं. CAF में, कस्टम चैनलों को CastSession
इंस्टेंस के साथ रजिस्टर किया जाता है. रजिस्ट्रेशन, SessionManagerListener.onSessionStarted
कॉलबैक वाले तरीके से किया जा सकता है. मीडिया ऐप्लिकेशन के लिए, अब Cast.CastApi.setMessageReceivedCallbacks
के ज़रिए मीडिया कंट्रोल चैनल को साफ़ तौर पर रजिस्टर करना ज़रूरी नहीं है. ज़्यादा जानकारी के लिए, नीचे दिया गया सेक्शन देखें.
मीडिया नियंत्रण
v2 क्लास
RemoteMediaPlayer
अब काम नहीं करती और इसका इस्तेमाल नहीं किया जाना चाहिए. CAF में, इसे नए RemoteMediaClient
क्लास ने बदल दिया है. यह क्लास, एपीआई में मिलती-जुलती सुविधाएं देता है. इस ऑब्जेक्ट को साफ़ तौर पर शुरू करने या रजिस्टर करने की ज़रूरत नहीं है. अगर कनेक्ट किए जा रहे वेब रिसीवर ऐप्लिकेशन में मीडिया नेमस्पेस की सुविधा काम करती है, तो फ़्रेमवर्क ऑब्जेक्ट को अपने-आप इंस्टैंशिएट कर देगा और सेशन शुरू होने के समय, उसमें मौजूद मीडिया चैनल को रजिस्टर कर देगा.
RemoteMediaClient
को CastSession
ऑब्जेक्ट के getRemoteMediaClient
तरीके के तौर पर ऐक्सेस किया जा सकता है.
वर्शन 2 में, RemoteMediaPlayer
पर किए गए सभी मीडिया अनुरोधों के लिए, PendingResult
कॉलबैक के ज़रिए RemoteMediaPlayer.MediaChannelResult
दिखेगा.
सीएफ़ में, RemoteMediaClient
पर किए गए सभी मीडिया अनुरोधों के लिए, PendingResult
कॉलबैक के ज़रिए RemoteMediaClient.MediaChannelResult
रिटर्न किया जाता है. इसका इस्तेमाल, अनुरोध की प्रोग्रेस और नतीजे को ट्रैक करने के लिए किया जा सकता है.
v2 RemoteMediaPlayer
, RemoteMediaPlayer.OnStatusUpdatedListener
के ज़रिए वेब रिसीवर पर मीडिया प्लेयर के स्टेटस में हुए बदलावों की सूचनाएं भेजेगा.
CAF में, RemoteMediaClient
अपने RemoteMediaClient.Listener
इंटरफ़ेस के ज़रिए मिलते-जुलते कॉलबैक उपलब्ध कराता है. RemoteMediaClient
के साथ, जितने चाहें उतने लिसनर रजिस्टर किए जा सकते हैं. इससे, सेशन से जुड़े RemoteMediaClient
के एक इंस्टेंस को कई सेंडर कॉम्पोनेंट शेयर कर सकते हैं.
v2 में, वेब रिसीवर पर मीडिया प्लेयर की स्थिति के साथ यूज़र इंटरफ़ेस को सिंक रखने का ज़िम्मेदारी, भेजने वाले ऐप्लिकेशन को लेनी पड़ती थी.
सीएफ़ में, क्लास UIMediaController
काफ़ी ज़्यादा ज़िम्मेदारी लेता है.
शुरुआती ओवरले
V2 में, शुरुआती ओवरले यूज़र इंटरफ़ेस (यूआई) नहीं दिया जाता.
सीएफ़, उपयोगकर्ताओं को पहली बार कास्ट बटन दिखाते समय, उसे हाइलाइट करने के लिए कस्टम व्यू IntroductoryOverlay
उपलब्ध कराता है.
मिनी कंट्रोलर
v2 में, आपको भेजने वाले ऐप्लिकेशन में नए सिरे से एक मिनी कंट्रोलर लागू करना होगा.
CAF में, SDK टूल एक कस्टम व्यू,
MiniControllerFragment
उपलब्ध कराता है. इसे उन गतिविधियों की ऐप्लिकेशन लेआउट फ़ाइल में जोड़ा जा सकता है जिनमें आपको मिनी कंट्रोलर दिखाना है.
सूचना और लॉक स्क्रीन
SDK, वर्शन 2 में सूचना और लॉक स्क्रीन के लिए कंट्रोलर उपलब्ध नहीं कराता. उस 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 का इस्तेमाल किया गया है.