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

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

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 सिंगलेटन को शुरू करना शामिल है.

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