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

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

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

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

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

डिपेंडेंसी

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

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

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

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

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

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

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

रीकनेक्शन लॉजिक

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

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

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

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

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

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

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

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

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

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

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

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

सीएएफ़ में, क्लास UIMediaController सबसे ज़्यादा ज़िम्मेदारी लेता है.

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

वर्शन 2 में शुरुआती ओवरले यूआई नहीं है.

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

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

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

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

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

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

सीएएफ़ में, 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 में, आपको सेंडर ऐप्लिकेशन में, बड़े किए गए कंट्रोलर को शुरू से लागू करना होगा.

सीएएफ़, एक UIMediaController हेल्पर क्लास उपलब्ध कराता है. इसकी मदद से, अपना बड़ा किया गया नियंत्रक आसानी से बनाया जा सकता है.

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

ऑडियो फ़ोकस

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

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

डीबग लॉगिंग

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

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

हमारे पास कोडलैब ट्यूटोरियल और सैंपल ऐप्लिकेशन हैं, जो सीएएफ़ का इस्तेमाल करते हैं.