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

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

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

परिचय

  • CAF Sender अब भी Google Play services के हिस्से के तौर पर उपलब्ध है. इसके लिए, Android SDK मैनेजर का इस्तेमाल किया जाता है
  • नए पैकेज जोड़े गए हैं, जो Google Cast डिज़ाइन की चेकलिस्ट (com.google.android.gms.cast.framework.*) का पालन करने की ज़िम्मेदारी लेते हैं
  • CAF Sender, ऐसे विजेट उपलब्ध कराता है जो Cast के यूज़र एक्सपीरियंस की ज़रूरी शर्तों को पूरा करते हैं. 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);
}

वर्शन 2 में, ये चरण ज़रूरी नहीं थे.

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

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"/>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

V2 में, शुरुआती ओवरले यूज़र इंटरफ़ेस (यूआई) नहीं दिया जाता.

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

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

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

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

ऑडियो फ़ोकस

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

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

डीबग लॉगिंग

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

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

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