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

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

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

परिचय

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

इन सेक्शन में, हम मुख्य रूप से वीडियो पर फ़ोकस करेंगे ऐप्लिकेशन CCL के VideoCastManager पर आधारित होते हैं, लेकिन कई मामलों में एक जैसा होता है. सिद्धांत DataCastManager पर भी लागू होते हैं.

डिपेंडेंसी

सीसीएल और सीएएफ़ की डिपेंडेंसी, AppCompat की सहायता लाइब्रेरी और MediaRouter v7 की सहायता लाइब्रेरी और Google Play services से. हालांकि, अंतर यह है कि सीएएफ़, Google Play में उपलब्ध नए कास्ट फ़्रेमवर्क पर निर्भर करता है 9.2.0 या उसके बाद के वर्शन.

अपनी create.gradle फ़ाइल में इन डिपेंडेंसी को हटाएं com.google.android.gms:play-services-cast और com.google.android.libraries.cast.companionlibrary:ccl, फिर नया कास्ट फ़्रेमवर्क जोड़ें:

dependencies {
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:mediarouter-v7:23.4.0'
    compile 'com.google.android.gms:play-services-cast-framework:9.4.0'
}

आपके पास Google Play सेवा के मेटाडेटा को हटाने का भी विकल्प होता है:

<meta‐data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>

सीएएफ़ में शामिल सभी सेवाएं, गतिविधियां, और संसाधन अपने-आप ऐप्लिकेशन के मेनिफ़ेस्ट और रिसॉर्स के साथ मर्ज किया गया हो.

सीएएफ़ के साथ काम करने वाला, Android SDK का कम से कम 9 वर्शन है (Gingerbread); CCL में Android SDK का कम से कम 10 वर्शन होना चाहिए.

CCL एक आसान तरीका उपलब्ध कराता है. BaseCastManager.checkGooglePlayServices(activity). इससे यह पुष्टि की जाती है कि Google Play services का वर्शन, डिवाइस पर उपलब्ध है. सीएएफ़ ये काम नहीं करता इसे Cast SDK टूल के हिस्से के तौर पर उपलब्ध कराते हैं. प्रक्रिया का पालन करें पक्का करें कि डिवाइसों पर Google Play services वाला APK मौजूद हो उपयोगकर्ता के डिवाइस पर सही Google Play services APK इंस्टॉल किया गया है, यह पक्का करने के लिए हो सकता है कि अपडेट सभी उपयोगकर्ताओं तक तुरंत न पहुंच पाएं.

आपको ऐप्लिकेशन के थीम.

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

सीसीएल के लिए, VideoCastManager.initialize() को इस ऐप्लिकेशन इंस्टेंस की onCreate() तरीका. यह लॉजिक ऐसा होना चाहिए आपके ऐप्लिकेशन के क्लास कोड से हटाया गया.

सीएएफ़ में, कास्ट करने की प्रोसेस शुरू करने के लिए, साफ़ तौर पर निर्देश देना ज़रूरी है फ़्रेमवर्क शामिल है. इसमें किसी सिंगलटन को इस्तेमाल करके, CastContext सिंगलटन को शुरू करना शामिल है पाने वाले का ऐप्लिकेशन आईडी और किसी भी समय के लिए सही OptionsProvider अन्य वैश्विक विकल्प हैं. CastContext, सीसीएल की तरह ही भूमिका निभाता है VideoCastManager के लिए सिंगलटन उपलब्ध कराएं, ताकि क्लाइंट इंटरैक्ट कर सकें. OptionsProvider, सीसीएल के CastConfiguration की तरह है. इसकी मदद से, कास्ट फ़्रेमवर्क सुविधाओं को कॉन्फ़िगर करने के लिए.

अगर आपका मौजूदा सीसीएल CastConfiguration.Builder ऐसा दिखता है, तो:

VideoCastManager.initialize(
   getApplicationContext(),
   new CastConfiguration.Builder(context.getString(R.string.app_id))
       .enableWifiReconnection()
       .enableAutoReconnect()
       .build());

इसके बाद, सीएएफ़ में CastOptions.Builder का इस्तेमाल करके, नीचे दिए गए CastOptionsProvider एक जैसा होगा:

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;
    }
}

हमारे ऐप्लिकेशन के नमूने पर एक नज़र डालें विकल्प उपलब्ध कराने के लिए.

"ऐप्लिकेशन" में, OptionProvider का एलान करें इसका एक सदस्य AndroidManifest.xml फ़ाइल:

<application>
...
    <meta-data
        android:name=
          "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider"    
    />
</application>

Activity के हर onCreate तरीके में CastContext को लेज़ली शुरू करें (न कि Application इंस्टेंस):

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

CastContext सिंगलटन को ऐक्सेस करने के लिए:

mCastContext = CastContext.getSharedInstance(this);

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

सीसीएल की VideoCastManager incrementUiCounter और decrementUiCounter को उसे आपके Activities के onResume और onPause तरीकों से हटा दिया जाएगा.

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

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

सीसीएल की तरह ही, ये कॉम्पोनेंट MediaRouter v7 की सहायता टीम से मिलती हैं लाइब्रेरी.

'कास्ट करें' बटन को MediaRouteButton अब भी लागू करता है और उसे जोड़ा जा सकता है आपकी गतिविधि को (ActionBar या Toolbar का इस्तेमाल करके), मेन्यू आइटम के तौर पर जोड़ा गया आपके मेन्यू में.

एक्सएमएल मेन्यू में MediaRouteActionProvider का एलान, इसके जैसा ही है CCL के साथ:

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

सीसीएल की तरह ही, हर ऐक्टिविटी के onCreateOptionमेन्यू() तरीके को बदलें. हालांकि, CastManager.addMediaRouterButton का इस्तेमाल करने के बजाय, CAF की CastButtonManufacturer का इस्तेमाल करें MediaRouteButton को कास्ट फ़्रेमवर्क से जोड़ने के लिए:

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
                                                menu,
                                                R.id.media_route_menu_item);
    return true;
}

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

सीएएफ़ में, सीसीएल की तरह ही डिवाइस कंट्रोल को काफ़ी हद तक फ़्रेमवर्क से मैनेज किया जाता है. भेजने वाले ऐप्लिकेशन को हैंडल करने की ज़रूरत नहीं है और न ही इसे मैनेज करने की कोशिश करनी चाहिए का उपयोग करके डिवाइस से कनेक्ट करना और रिसीवर ऐप्लिकेशन को लॉन्च करना GoogleApiClient.

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

सीसीएल में कलाकारों को ट्रैक करने के लिए, आपको VideoCastConsumerImpl क्लास बढ़ानी होगी सेशन की स्थिति:

private final VideoCastConsumer mCastConsumer = new VideoCastConsumerImpl() {
  public void onApplicationConnected(ApplicationMetadata appMetadata, 
                                     String sessionId,
                                     boolean wasLaunched) {}
  public void onDisconnectionReason(int reason) {}
  public void onDisconnected() {}
}

सीएएफ़ में, ईमेल भेजने वाले के ऐप्लिकेशन को सेशन के लाइफ़साइकल इवेंट की सूचना इसके ज़रिए दी जा सकती है SessionManager के साथ SessionManagerListener को रजिस्टर किया जा रहा है. कॉन्टेंट बनाने SessionManagerListener कॉलबैक, सभी सेशन के लिए कॉलबैक के तरीके तय करता है लाइफ़साइकल इवेंट.

नीचे दिए गए SessionManagerListener तरीके, CCL के VideoCastConsumer इंटरफ़ेस:

  • VideoCastConsumer.onApplicationConnected -> SessionManagerListener.onSessionStarted
  • VideoCastConsumer.onDisconnected -> SessionManagerListener.onSessionEnded

SessionManagerListener इंटरफ़ेस को लागू करने वाली क्लास का एलान करें और मिलते-जुलते तरीकों के लिए VideoCastConsumerImpl लॉजिक:

private class CastSessionManagerListener implements SessionManagerListener<CastSession> {
  public void onSessionEnded(CastSession session, int error) {}
  public void onSessionStarted(CastSession session, String sessionId) {}
  public void onSessionEnding(CastSession session) {}
  ...
}

CastSession क्लास, कास्ट डिवाइस वाले सेशन को दिखाती है. इस क्लास में डिवाइस की आवाज़ और म्यूट की स्थिति को कंट्रोल करने के तरीके बताए गए हैं. CCL का इस्तेमाल BaseCastManager.

किसी उपभोक्ता को जोड़ने के लिए, सीसीएल VideoCastManager का इस्तेमाल करने के बजाय:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

अब अपना SessionManagerListener रजिस्टर करें:

mCastSessionManager = 
    CastContext.getSharedInstance(this).getSessionManager();
mCastSessionManagerListener = new CastSessionManagerListener();
mCastSessionManager.addSessionManagerListener(mCastSessionManagerListener,
                  CastSession.class);

सीसीएल में इवेंट को सुनने की सुविधा बंद करने के लिए:

VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);

अब सेशन के इवेंट को सुनना बंद करने के लिए, SessionManager का इस्तेमाल करें:

mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
                    CastSession.class);

कास्ट डिवाइस से साफ़ तौर पर डिसकनेक्ट करने के लिए, CCL ने इनका इस्तेमाल किया:

VideoCastManager.disconnectDevice(boolean stopAppOnExit, 
            boolean clearPersistedConnectionData,
            boolean setDefaultRoute)

सीएएफ़ के लिए, SessionManager का इस्तेमाल करें:

CastContext.getSharedInstance(this).getSessionManager()
                                   .endCurrentSession(true);

यह पता करने के लिए कि ईमेल भेजने वाला व्यक्ति, रिसीवर से कनेक्ट है या नहीं, CCL VideoCastManager.getInstance().isConnected(), लेकिन सीएएफ़ में SessionManager:

public boolean isConnected() {
    CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                  .getSessionManager()
                                  .getCurrentCastSession();
    return (castSession != null && castSession.isConnected());
}

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

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

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

सीएएफ़ अपनी खुद की फिर से कनेक्ट करने की सेवा देता है, ताकि आप अपने मेनिफ़ेस्ट से CCL ReconnectionService पर जाएं:

<service android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>

आपको इस काम के लिए अपने मेनिफ़ेस्ट में इन अनुमतियों की भी ज़रूरत नहीं है: फिर से कनेक्ट करने का लॉजिक:

<uses‐permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/>

CAF से दोबारा कनेक्ट करने की सेवा डिफ़ॉल्ट रूप से चालू होती है. हालांकि, इसे CastOptions.

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

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

सीसीएल में, मैसेज पाने वाले व्यक्ति के लिए पसंद के मुताबिक मैसेज चैनल बनाने के दो तरीके हैं:

  • CastConfiguration में आपको एक से ज़्यादा नेमस्पेस तय करने की सुविधा मिलती है और सीसीएल तो अपने लिए चैनल बनाएं.
  • DataCastManager, VideoCastManager की तरह है, लेकिन गैर-मीडिया कॉन्टेंट पर फ़ोकस है इस्तेमाल के उदाहरण.

कस्टम चैनल बनाने का इनमें से कोई भी तरीका सीएएफ़ की मदद से काम नहीं करता -- आप इसके बजाय, नीचे दी गई प्रक्रिया कस्टम चैनल जोड़ना भेजने वाले ऐप्लिकेशन के लिए.

CCL की तरह ही, मीडिया ऐप्लिकेशन के लिए, मीडिया कंट्रोल चैनल रजिस्टर करें.

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

सीएएफ़ में, RemoteMediaClient क्लास, VideoCastManager की वैल्यू के बराबर होती है मीडिया तरीकों का इस्तेमाल करें. RemoteMediaClient.Listener इसके बराबर है VideoCastConsumer तरीके. खास तौर पर, onRemoteMediaPlayerMetadataUpdated और onRemoteMediaPlayerStatusUpdated VideoCastConsumer तरीकों से onMetadataUpdated और RemoteMediaClient.Listener की onStatusUpdated तरीके:

private class CastMediaClientListener implements RemoteMediaClient.Listener {

    @Override
    public void onMetadataUpdated() {
        setMetadataFromRemote();
    }

    @Override
    public void onStatusUpdated() {
        updatePlaybackState();
    }

    @Override
    public void onSendingRemoteMediaRequest() {
    }

    @Override
    public void onQueueStatusUpdated() {
    }

    @Override
    public void onPreloadStatusUpdated() {
    }
}

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

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

CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                     .getSessionManager()
                                     .getCurrentCastSession();
mRemoteMediaClient = castSession.getRemoteMediaClient();
mRemoteMediaClientListener = new CastMediaClientListener();

सीसीएल के बजाय:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

अब सीएएफ़ का इस्तेमाल करें:

mRemoteMediaClient.addListener(mRemoteMediaClientListener);

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

CCL के VideoCastManager में मीडिया प्लेबैक को मैनेज करने के तरीके मौजूद हैं:

VideoCastManager manager = VideoCastManager.getInstance();
if (manager.isRemoteMediaLoaded()) {
    manager.pause();
    mCurrentPosition = (int) manager.getCurrentMediaPosition();
}

इन्हें अब CAF में RemoteMediaClient के ज़रिए लागू किया जाता है:

if (mRemoteMediaClient.hasMediaSession()) {
    mRemoteMediaClient.pause();
    mCurrentPosition = 
        (int)mRemoteMediaClient.getApproximateStreamPosition();
}

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

CCL और CAF, दोनों को दिखाने के लिए MediaInfo और MediaMetadata क्लास का इस्तेमाल किया जाता है मीडिया आइटम चुनने और मीडिया लोड करने के लिए.

सीसीएल में मीडिया लोड करने के लिए, VideoCastManager का इस्तेमाल किया जाता है:

VideoCastManager.getInstance().loadMedia(media, autoPlay, mCurrentPosition, customData);

सीएएफ़ में, RemoteMediaClient का इस्तेमाल मीडिया लोड करने के लिए किया जाता है:

mRemoteMediaClient.load(media, autoPlay, mCurrentPosition, customData);

किसी मौजूदा मीडिया सेशन की स्थिति और Media की जानकारी पाने के लिए पाने वाला है, तो सीसीएल VideoCastManager का इस्तेमाल करता है:

MediaInfo mediaInfo = VideoCastManager.getInstance()
                                      .getRemoteMediaInformation();
int status = VideoCastManager.getInstance().getPlaybackStatus();
int idleReason = VideoCastManager.getInstance().getIdleReason();

सीएएफ़ में, यही जानकारी पाने के लिए RemoteMediaClient का इस्तेमाल करें:

MediaInfo mediaInfo = mRemoteMediaClient.getMediaInfo();
int status = mRemoteMediaClient.getPlayerState();
int idleReason = mRemoteMediaClient.getIdleReason();

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

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

सीसीएल का VideoCastConsumer onCastAvailabilityChanged तरीका इस्तेमाल करने के बजाय ओवरले को कब दिखाना है, यह जानने के लिए, CastStateListener का इस्तेमाल करें जब कास्ट डिवाइस को MediaRouter के लोकल नेटवर्क:

private IntroductoryOverlay mIntroductoryOverlay;
private MenuItem mMediaRouteMenuItem;

protected void onCreate(Bundle savedInstanceState) {
    ...
    mCastStateListener = new CastStateListener() {
        @Override
        public void onCastStateChanged(int newState) {
            if (newState != CastState.NO_DEVICES_AVAILABLE) {
                showIntroductoryOverlay();
            }
        }
    };
    mCastContext = CastContext.getSharedInstance(this);
    mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this, 
        savedInstanceState);
}

protected void onResume() {
    mCastContext.addCastStateListener(mCastStateListener);
    ...
}

protected void onPause() {
    mCastContext.removeCastStateListener(mCastStateListener);
    ...
}

MediaRouteMenuItem इंस्टेंस का ट्रैक रखें:

public boolean onCreateOptionsMenu(Menu menu) {
   super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    mMediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(
            getApplicationContext(), menu,
            R.id.media_route_menu_item);
    showIntroductoryOverlay();
    return true;
}

जांच करें कि क्या MediaRouteButton दिखाई दे रहा है, ताकि शुरुआती ओवरले दिखाए जा सकते हैं:

private void showIntroductoryOverlay() {
    if (mIntroductoryOverlay != null) {
        mIntroductoryOverlay.remove();
    }
    if ((mMediaRouteMenuItem != null) && mMediaRouteMenuItem.isVisible()) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mIntroductoryOverlay = new IntroductoryOverlay.Builder(
                        VideoBrowserActivity.this, mMediaRouteMenuItem)
                        .setTitleText(getString(R.string.introducing_cast))
                        .setOverlayColor(R.color.primary)
                        .setSingleTime()
                        .setOnOverlayDismissedListener(
                                new IntroductoryOverlay
                                    .OnOverlayDismissedListener() {
                                        @Override
                                        public void onOverlayDismissed() {
                                            mIntroductoryOverlay = null;
                                        }
                                })
                        .build();
                mIntroductoryOverlay.show();
            }
        });
    }
}

हमारे ऐप्लिकेशन का नमूना पर क्लिक करें.

शुरुआती ओवरले की शैली को पसंद के मुताबिक बनाने के लिए, यह प्रक्रिया अपनाएं शुरुआती ओवरले को पसंद के मुताबिक बनाएं.

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

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

<fragment
        android:id="@+id/cast_mini_controller"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:castShowImageThumbnail="true"
        android:visibility="gone"
        class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />

सीएएफ़, सीसीएल के MiniController के साथ काम करने वाले मैन्युअल कॉन्फ़िगरेशन के साथ काम नहीं करता साथ ही, इसमें Autoplay सुविधा का इस्तेमाल नहीं किया जा सकता.

मिनी कंट्रोलर की स्टाइल और बटन को पसंद के मुताबिक बनाने के लिए, प्रक्रिया मिनी कंट्रोलर को पसंद के मुताबिक बनाएं.

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

सीसीएल के VideoCastNotificationService की तरह ही, सीएएफ़ मीडिया की सूचनाओं के दिखने की सेटिंग मैनेज करने के लिए MediaNotificationService को भी कास्ट किया जा सकता है.

आपको अपने मेनिफ़ेस्ट से यह जानकारी हटानी होगी:

  • VideoIntentReceiver
  • VideoCastNotificationService

CCL का इस्तेमाल करके, CastConfiguration.Builder; जो सीएएफ़ के साथ काम नहीं करता.

सीसीएल का इस्तेमाल करके, यह CastManager शुरू करें:

VideoCastManager.initialize(
   getApplicationContext(),
   new CastConfiguration.Builder(
           context.getString(R.string.app_id))
       .addNotificationAction(
           CastConfiguration.NOTIFICATION_ACTION_PLAY_PAUSE,true)
       .addNotificationAction(
           CastConfiguration.NOTIFICATION_ACTION_DISCONNECT,true)
       .build());

सीएएफ़ में एक जैसे कॉन्फ़िगरेशन के लिए, SDK टूल NotificationsOptions.Builder, ताकि आपको नोटिफ़िकेशन और लॉक स्क्रीन को भेजने के लिए. सूचना और लॉक शुरू करते समय, CastOptions की मदद से स्क्रीन कंट्रोल चालू किए जा सकते हैं CastContext.

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = 
        new NotificationOptions.Builder()
            .setActions(Arrays.asList(
                MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
                MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{0, 1})
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
             .setNotificationOptions(notificationOptions)
             .build();
    return new CastOptions.Builder()
             .setReceiverApplicationId(context.getString(R.string.app_id))
             .setCastMediaOptions(mediaOptions)
             .build();
}

सीएएफ़ में, सूचनाएं और लॉक स्क्रीन से जुड़े कंट्रोल हमेशा चालू रहते हैं. साथ ही, यह भी ध्यान रखें कि चलाएं/रोकें और कास्ट करना बंद करें बटन डिफ़ॉल्ट रूप से उपलब्ध होते हैं. CAF तय करने के लिए गतिविधि की उपलब्धता को अपने-आप ट्रैक करेगा मीडिया सूचना कब दिखाई जाए, सिर्फ़ जिंजरब्रेड को छोड़कर. (जिंजरब्रेड के लिए, शुरुआती नोट यहां देखें: registerLifecycleCallbacksBeforeIceCreamSandwich() का इस्तेमाल करके; CCL VideoCastManager incrementUiCounter और decrementUiCounter कॉल हटाया जाना चाहिए.)

सूचनाओं में दिखने वाले बटन को पसंद के मुताबिक बनाने के लिए, प्रक्रिया सूचना और लॉक स्क्रीन पर मीडिया कंट्रोल जोड़ें.

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

CCL, VideoCastControllerActivity और VideoCastControllerFragment उपलब्ध कराता है का इस्तेमाल करें.

मेनिफ़ेस्ट में से VideoCastControllerActivity एलान को हटाया जा सकता है.

सीएएफ़ में, आपको expandedControllerActivity बढ़ाएं और कास्ट करें बटन जोड़ें.

बड़ी स्क्रीन पर दिखने वाली स्टाइल और बटन को पसंद के मुताबिक बनाने के लिए कंट्रोलर के लिए, नीचे दी गई प्रक्रिया का पालन करें एक्सपैंडेड कंट्रोलर को पसंद के मुताबिक बनाएं.

ऑडियो फ़ोकस

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

आवाज़ कंट्रोल करें

जिंजरब्रेड के लिए, सीसीएल की तरह ही dispatchKeyEvent होना ज़रूरी है. ICS और बाद में दोनों के लिए, वॉल्यूम कंट्रोल अपने-आप मैनेज होता है.

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

सबटाइटल

Android KitKat और इसके बाद के वर्शन में, कैप्शन की मदद से कैप्शन अपनी पसंद के मुताबिक बनाए जा सकते हैं सेटिंग, यह सेटिंग > सुलभता. Android के पिछले वर्शन में, हालांकि, उनकी यह क्षमता नहीं है. CCL कस्टम जानकारी देकर इसे मैनेज करता है पुराने वर्शन के लिए सेटिंग और KitKat पर सिस्टम सेटिंग का ऐक्सेस देने की सुविधा और ज़्यादा.

सीएएफ़, कैप्शन की प्राथमिकताएं बदलने के लिए कस्टम सेटिंग उपलब्ध नहीं कराता. आपने लोगों तक पहुंचाया मुफ़्त में को आपके मेनिफ़ेस्ट में CaptionsPreferenceActivity संदर्भ को हटा देना चाहिए और आपकी प्राथमिकताओं से जुड़ी एक्सएमएल सबमिट करें.

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

क्लोज़्ड कैप्शनिंग एपीआई सीएएफ़ में, वर्शन 2 से मिलता-जुलता है.

डीबग लॉगिंग

सीएएफ़, डीबग लॉग करने की सेटिंग उपलब्ध नहीं कराता.

अन्य सुविधाएं

सीएएफ़ में, सीसीएल की ये सुविधाएं काम नहीं करतीं:

  • MediaAuthService देकर, वीडियो चलाने से पहले अनुमति लेना
  • कॉन्फ़िगर किए जा सकने वाले यूज़र इंटरफ़ेस (यूआई) मैसेज

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

Android के लिए Universal Music Player (uamp) सैंपल ऐप्लिकेशन को सीसीएल से सीएएफ़ में माइग्रेट करने के लिए, डिफ़र को देखें.

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