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

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

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

शुरुआती जानकारी

  • CAF सेंडर को अब भी Google Play services के हिस्से के तौर पर डिस्ट्रिब्यूट किया जा रहा है और उनका इस्तेमाल Android SDK Manager
  • नए पैकेज जोड़े गए हैं, जिन पर Google Cast डिज़ाइन चेकलिस्ट (com.google.android.gms.cast.framework.*) का पालन करने की ज़िम्मेदारी है
  • CAF सेंडर ऐसे विजेट उपलब्ध कराता है जो Cast UX की ज़रूरी शर्तों का पालन करते हैं; v2 में कोई यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट नहीं है और आपको इन विजेट को लागू करने की ज़रूरत है.
  • Cast API का इस्तेमाल करने के लिए, अब GoogleApiClient के इस्तेमाल की ज़रूरत नहीं है.
  • CAF प्रेषक में सबटाइटल की सुविधा, v2 के समान है.

डिपेंडेंसी

वर्शन 2 और CAF की सपोर्ट लाइब्रेरी और Google Play services (9.2.0 या इसके बाद के वर्शन) पर एक जैसी निर्भरता हैं, जैसा कि सहायता लाइब्रेरी की सुविधाओं से जुड़ी गाइड में बताया गया है

CAF के साथ काम करने वाला, Android SDK का कम से कम वर्शन 9 (Gingerbread) है.

डेटा लेयर में इवेंट बनाने की प्रोसेस

CAF में, कास्ट फ़्रेमवर्क के लिए साफ़ तौर पर शुरू करने का चरण ज़रूरी है. इसमें 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 फ़ाइल के "ऐप्लिकेशन" टैग में 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 में यह तरीका ज़रूरी नहीं था.

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

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

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

वर्शन 2 की तरह, ये कॉम्पोनेंट 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 को कास्ट फ़्रेमवर्क के साथ जोड़ने के लिए 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;
}

जब कोई व्यक्ति इस बटन पर टैप करता है, तो कास्ट करें डायलॉग अपने-आप प्रज़ेंट हो जाता है.

डिवाइस नियंत्रण

सीएएफ़ में, डिवाइस कंट्रोल को काफ़ी हद तक फ़्रेमवर्क के ज़रिए मैनेज किया जाता है. भेजने वाले ऐप्लिकेशन को डिवाइस से कनेक्ट करने और GoogleApiClient का इस्तेमाल करके वेब रिसीवर ऐप्लिकेशन लॉन्च करने की ज़रूरत नहीं है और न ही उसे हैंडल करना चाहिए. भेजने वाले और वेब पाने वाले के बीच होने वाले इंटरैक्शन को अब "सेशन" के तौर पर दिखाया जाता है. SessionManager क्लास, सेशन की लाइफ़साइकल को हैंडल करती है और उपयोगकर्ता के जेस्चर के जवाब में, सेशन को अपने-आप शुरू और बंद करती है: सेशन तब शुरू होता है, जब उपयोगकर्ता, कास्ट करने के डायलॉग में कोई डिवाइस चुनता है. यह तब खत्म हो जाता है, जब उपयोगकर्ता, कास्ट करने के डायलॉग बॉक्स में “कास्ट करना बंद करें” बटन पर टैप करता है या ऐप्लिकेशन बंद कर देता है. ईमेल भेजने वाले व्यक्ति को, SessionManagerListener SessionManager के साथ रजिस्टर करके, सेशन के लाइफ़साइकल इवेंट के बारे में सूचना दी जा सकती है. SessionManagerListener कॉलबैक, सभी सेशन लाइफ़साइकल इवेंट के लिए कॉलबैक के तरीके तय करते हैं.

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

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

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

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

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

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

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

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

मीडिया नियंत्रण

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

RemoteMediaClient को CastSession ऑब्जेक्ट के getRemoteMediaClient तरीके से ऐक्सेस किया जा सकता है.

वर्शन 2 में, RemoteMediaPlayer पर जारी किए गए सभी मीडिया अनुरोध, PendingResult कॉलबैक के ज़रिए RemoteMediaPlayer.MediaChannelResult भेजेंगे.

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

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

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

वर्शन 2 में, भेजने वाले ऐप्लिकेशन को उपयोगकर्ता इंटरफ़ेस को वेब रिसीवर पर मौजूद मीडिया प्लेयर की स्थिति के साथ सिंक रखने का बोझ उठाना पड़ता है.

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

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

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

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

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

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

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

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

वर्शन 2 में, SDK टूल से सूचना और लॉक स्क्रीन के लिए कंट्रोलर नहीं दिए जाते. इस SDK टूल के लिए, आपको Android फ़्रेमवर्क एपीआई का इस्तेमाल करके, भेजने वाले ऐप्लिकेशन में ये सुविधाएं बनानी होंगी.

CAF में, SDK टूल एक 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();
}

बड़ा किया गया कंट्रोलर

वर्शन 2 में, आपको सेंडर ऐप्लिकेशन में नए सिरे से एक बड़ा किया गया कंट्रोलर लागू करना होगा.

CAF एक UIMediaController हेल्पर क्लास उपलब्ध कराता है, जिससे आपके लिए अपना बड़ा किया जा सकने वाला कंट्रोलर बनाना आसान हो जाता है.

CAF पहले से बना, बड़ा किया गया कंट्रोलर विजेट जोड़ता है ExpandedControllerActivity इसे आसानी से अपने ऐप्लिकेशन में जोड़ा जा सकता है. अब आपको UIMediaController का इस्तेमाल करके, कस्टम एक्सपैंडेड कंट्रोलर को लागू करने की ज़रूरत नहीं है.

ऑडियो फ़ोकस

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

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

डीबग लॉगिंग

सीएएफ़ में, डेटा को लॉग करने का कोई विकल्प नहीं होता.

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

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