Android सेंडर ऐप्लिकेशन को Cast SDK v2 से कास्ट ऐप्लिकेशन फ़्रेमवर्क (CAF) में माइग्रेट करें

नीचे दी गई प्रोसेस की मदद से, Android डिवाइस पर मौजूद सेंडर ऐप्लिकेशन को Cast SDK v2 से CAF Sender में बदला जा सकता है. यह CastContext सिंगलटन पर आधारित है.

Cast CAF Sender SDK, आपकी ओर से GoogleAPIClient को मैनेज करने के लिए CastContext का इस्तेमाल करता है. 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 या इसके बाद का वर्शन) की एक जैसी डिपेंडेंसी होती हैं. इनके बारे में Support Library की सुविधाओं से जुड़ी गाइड में बताया गया है

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 में इन चरणों को पूरा करना ज़रूरी नहीं था.

कास्ट की सुविधा वाले डिवाइस खोजना

CAF में, ऐप्लिकेशन के फ़ोरग्राउंड में आने पर डिवाइसों को खोजने की प्रोसेस अपने-आप शुरू हो जाती है. वहीं, ऐप्लिकेशन के बैकग्राउंड में जाने पर यह प्रोसेस अपने-आप बंद हो जाती है. MediaRouteSelector और MediaRouter.Callback का इस्तेमाल नहीं किया जाना चाहिए.

कास्ट बटन और कास्ट डायलॉग

v2 की तरह, ये कॉम्पोनेंट 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"/>

MediaRouteButton को Cast फ़्रेमवर्क से जोड़ने के लिए, हर ऐक्टिविटी के onCreateOptionMenu() तरीके को 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 क्लास, सेशन के लाइफ़साइकल को मैनेज करती है. साथ ही, उपयोगकर्ता के जेस्चर के जवाब में सेशन को अपने-आप शुरू और बंद करती है: सेशन तब शुरू होता है, जब उपयोगकर्ता Cast डायलॉग में कोई Cast डिवाइस चुनता है. सेशन तब खत्म होता है, जब उपयोगकर्ता Cast डायलॉग में "कास्ट करना बंद करें" बटन पर टैप करता है या जब भेजने वाला ऐप्लिकेशन खुद बंद हो जाता है. सेंडर ऐप्लिकेशन को सेशन के लाइफ़साइकल इवेंट की सूचनाएं मिल सकती हैं. इसके लिए, उसे SessionManager के साथ SessionManagerListener रजिस्टर करना होगा. SessionManagerListener कॉलबैक, सेशन के लाइफ़साइकल के सभी इवेंट के लिए कॉलबैक के तरीके तय करते हैं.

CastSession क्लास, कास्ट डिवाइस के साथ सेशन को दिखाता है. इस क्लास में, डिवाइस के वॉल्यूम और म्यूट करने की स्थितियों को कंट्रोल करने के तरीके हैं. पहले, v2 में Cast.CastApi पर मौजूद तरीकों का इस्तेमाल करके ऐसा किया जाता था.

दूसरे वर्शन में, Cast.Listener कॉलबैक, डिवाइस की स्थिति में होने वाले बदलावों की सूचनाएं देते थे. इनमें वॉल्यूम, म्यूट करने की स्थिति, स्टैंडबाय स्टेटस वगैरह शामिल हैं.

CAF में, वॉल्यूम/म्यूट की स्थिति में बदलाव होने की सूचनाएं अब भी Cast.Listener में कॉलबैक तरीकों के ज़रिए दी जाती हैं; ये लिसनर, CastSession के साथ रजिस्टर किए जाते हैं. डिवाइस की स्थिति से जुड़ी बाकी सभी सूचनाएं, CastStateListener कॉलबैक के ज़रिए भेजी जाती हैं. ये लिसनर, CastSession के साथ रजिस्टर होते हैं. पक्का करें कि जब जुड़े हुए फ़्रैगमेंट, गतिविधियां या ऐप्लिकेशन बैकग्राउंड में चले जाएं, तब भी लिसनर को अनरजिस्टर कर दिया जाए.

फिर से कनेक्ट करने का लॉजिक

v2 की तरह ही, CAF भी उन नेटवर्क कनेक्शन को फिर से चालू करने की कोशिश करता है जो वाई-फ़ाई सिग्नल के कुछ समय के लिए बंद होने या नेटवर्क से जुड़ी अन्य गड़बड़ियों की वजह से बंद हो जाते हैं. अब यह काम सेशन लेवल पर किया जाता है. कनेक्शन टूट जाने पर, सेशन "निलंबित" स्थिति में आ सकता है. कनेक्टिविटी वापस आने पर, यह "कनेक्ट किया गया" स्थिति में वापस आ जाएगा. इस फ़्रेमवर्क में, वेब रिसीवर ऐप्लिकेशन से फिर से कनेक्ट करने और इस प्रोसेस के तहत किसी भी कास्ट चैनल को फिर से कनेक्ट करने की सुविधा होती है.

इसके अलावा, CAF में सेशन अपने-आप फिर से शुरू होने की सुविधा भी जोड़ी जाती है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसे 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 को वापस भेजते हैं.

सीएएफ़ में, 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 का इस्तेमाल करके, कस्टम बड़ा कंट्रोलर लागू करने की ज़रूरत नहीं है.

ऑडियो फ़ोकस

दूसरे वर्शन में, ऑडियो फ़ोकस को मैनेज करने के लिए आपको MediaSessionCompat का इस्तेमाल करना होगा.

CAF में, ऑडियो फ़ोकस को अपने-आप मैनेज किया जाता है.

डीबग लॉगिंग

CAF में लॉगिंग के कोई विकल्प नहीं हैं.

सैंपल ऐप्लिकेशन

हमारे पास CAF का इस्तेमाल करने वाले कोडलैब ट्यूटोरियल और सैंपल ऐप्लिकेशन हैं.