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

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

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

परिचय

  • CAF Sender को अब भी Android SDK Manager का इस्तेमाल करके, Google Play services के हिस्से के तौर पर डिस्ट्रिब्यूट किया जाता है
  • नए पैकेज जोड़े गए हैं, जो Google Cast Design की चेकलिस्ट (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 सिंगलटन को शुरू करना शामिल है. साथ ही, वेब रिसीवर ऐप्लिकेशन आईडी और अन्य ग्लोबल विकल्पों के बारे में बताने के लिए, सही 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"/>

Cast फ़्रेमवर्क से MediaRouteButton को कनेक्ट करने के लिए, हर गतिविधि के 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 क्लास, Cast डिवाइस के साथ सेशन को दिखाता है. इस क्लास में, डिवाइस के वॉल्यूम और म्यूट करने की स्थितियों को कंट्रोल करने के तरीके हैं. पहले, v2 में Cast.CastApi पर मौजूद तरीकों का इस्तेमाल करके ऐसा किया जाता था.

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

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

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

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

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

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

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

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

v2 में, भेजने वाले ऐप्लिकेशन को उपयोगकर्ता इंटरफ़ेस को वेब रिसीवर पर मीडिया प्लेयर की स्थिति के साथ सिंक करने की ज़िम्मेदारी लेनी पड़ती थी.

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

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

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

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

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

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

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

ऑडियो फ़ोकस

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

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

डीबग लॉगिंग

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

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

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