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

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

Cast CAF Sender SDK, आपकी ओर से GoogleAPIClient को मैनेज करने के लिए CastContext का इस्तेमाल करता है. CastContext, आपके लिए लाइफ़साइकल, गड़बड़ियां, और कॉलबैक को मैनेज करता है. इससे Cast ऐप्लिकेशन को डेवलप करना काफ़ी आसान हो जाता है.

परिचय

  • CAF Sender को अब भी Android SDK मैनेजर का इस्तेमाल करके, 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 फ़्रेमवर्क के लिए, डेटा लेयर में इवेंट बनाने की प्रोसेस का एक चरण ज़रूरी है. इसमें, Web Receiver ऐप्लिकेशन का आईडी और अन्य ग्लोबल विकल्प तय करने के लिए, सही OptionsProvider का इस्तेमाल करके, CastContext singleton को शुरू करना शामिल है.

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 सपोर्ट लाइब्रेरी से उपलब्ध कराए जाते हैं.

कास्ट बटन को अब भी 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"/>

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

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

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

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

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

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

इसके अलावा, CAF में सेशन को अपने-आप फिर से शुरू करने की सुविधा भी जोड़ी गई है. यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. इसे की मदद से बंद किया जा सकता है. CastOptions अगर कास्ट सेशन के दौरान, सेंडर ऐप्लिकेशन को बैकग्राउंड में भेज दिया जाता है या बंद कर दिया जाता है (स्वाइप करके हटाने या क्रैश होने की वजह से), तो फ़्रेमवर्क उस सेशन को फिर से शुरू करने की कोशिश करेगा. ऐसा तब होगा, जब सेंडर ऐप्लिकेशन फ़ोरग्राउंड में वापस आएगा या उसे फिर से लॉन्च किया जाएगा. इसे SessionManager अपने-आप मैनेज करता है. यह रजिस्टर किए गए किसी भी SessionManagerListener इंस्टेंस पर सही कॉलबैक जारी करेगा.

कस्टम चैनल का रजिस्ट्रेशन

v2 में, कस्टम चैनल (Cast.MessageReceivedCallback) को Cast.CastApi के साथ रजिस्टर किया जाता है. CAF में, कस्टम चैनल को CastSession इंस्टेंस के साथ रजिस्टर किया जाता है. रजिस्ट्रेशन, SessionManagerListener.onSessionStarted कॉलबैक मेथड में किया जा सकता है. मीडिया ऐप्लिकेशन के लिए, अब Cast.CastApi.setMessageReceivedCallbacks के ज़रिए, मीडिया कंट्रोल चैनल को साफ़ तौर पर रजिस्टर करना ज़रूरी नहीं है. ज़्यादा जानकारी के लिए, अगला सेक्शन देखें.

मीडिया कंट्रोल

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

RemoteMediaClient को CastSession ऑब्जेक्ट के getRemoteMediaClient मेथड के तौर पर ऐक्सेस किया जा सकता है.

v2 में, RemoteMediaPlayer पर जारी किए गए सभी मीडिया अनुरोध, PendingResult कॉलबैक के ज़रिए RemoteMediaPlayer.MediaChannelResult दिखाते थे.

CAF में, RemoteMediaClient पर जारी किए गए सभी मीडिया अनुरोध, RemoteMediaClient.MediaChannelResult कॉलबैक के ज़रिए PendingResult दिखाते हैं. इसका इस्तेमाल, अनुरोध की प्रोसेस और आखिर में मिलने वाले नतीजे को ट्रैक करने के लिए किया जा सकता है.

v2 RemoteMediaPlayer Web Receiver पर मीडिया प्लेयर की स्थिति में होने वाले बदलावों के बारे में सूचनाएं, RemoteMediaPlayer.OnStatusUpdatedListener के ज़रिए भेजता था.

CAF में, RemoteMediaClient अपने RemoteMediaClient.Listener इंटरफ़ेस के ज़रिए, इसके जैसी ही कॉलबैक उपलब्ध कराता है. RemoteMediaClient के साथ, कई लिसनर रजिस्टर किए जा सकते हैं. इससे, सेंडर के कई कॉम्पोनेंट, सेशन से जुड़े RemoteMediaClient के सिंगल इंस्टेंस को शेयर कर सकते हैं.

v2 में, सेंडर ऐप्लिकेशन को Web Receiver पर मीडिया प्लेयर की स्थिति के साथ, यूज़र इंटरफ़ेस को सिंक में रखने की ज़िम्मेदारी लेनी पड़ती थी.

CAF में, क्लास UIMediaController इस ज़िम्मेदारी को ज़्यादातर संभालती है.

शुरुआती ओवरले

v2 में, शुरुआती ओवरले यूज़र इंटरफ़ेस (यूआई) उपलब्ध नहीं है.

CAF, Cast बटन को हाइलाइट करने के लिए, कस्टम व्यू IntroductoryOverlay उपलब्ध कराता है. यह बटन, उपयोगकर्ताओं को पहली बार दिखाया जाता है.

मिनी कंट्रोलर

v2 में, आपको सेंडर ऐप्लिकेशन में, मिनी कंट्रोलर को शुरू से लागू करना पड़ता है.

CAF में, SDK टूल एक कस्टम व्यू, MiniControllerFragment, उपलब्ध कराता है. इसे उन ऐक्टिविटी की ऐप्लिकेशन लेआउट फ़ाइल में जोड़ा जा सकता है जिनमें मिनी कंट्रोलर दिखाना है.

सूचना और लॉक स्क्रीन

v2 में, SDK टूल, सूचना और लॉक स्क्रीन के लिए कंट्रोलर उपलब्ध नहीं कराता है. उस SDK टूल के लिए, आपको Android फ़्रेमवर्क एपीआई का इस्तेमाल करके, इन सुविधाओं को अपने सेंडर ऐप्लिकेशन में बनाना होगा.

CAF में, SDK टूल, NotificationsOptions.Builder उपलब्ध कराता है. इससे, सेंडर ऐप्लिकेशन में सूचना और लॉक स्क्रीन के लिए मीडिया कंट्रोल बनाने में मदद मिलती है. CastOptions की मदद से, CastContext को शुरू करते समय, सूचना और लॉक स्क्रीन के कंट्रोल को चालू किया जा सकता है.

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 का इस्तेमाल करते हैं.