CCL Gönderen Uygulamasını Yayın Uygulaması Çerçevesi'ne (CAF) taşıma

Aşağıdaki prosedür, Android gönderen uygulamanızı Cast SDK v2'den CCL'ye CAF'ye dönüştürmenizi sağlar. CCL işlevlerinin tümü CAF'de uygulanmıştır, bu nedenle taşıma işleminden sonra CCL'yi kullanmanız gerekmez.

Cast CAF Gönderen SDK'sı, GoogleAPIClient'ı sizin adınıza yönetmek için CastContext'i kullanır. CastContext, yaşam döngülerini, hataları ve geri çağırmaları sizin için yönetir. Bu da Cast uygulaması geliştirmeyi büyük ölçüde kolaylaştırır.

Giriş

  • CAF Gönderen tasarımı, Yayın Tamamlayıcı Kitaplığı'ndan etkilendiğinden CCL'den CAF Gönderen'e taşıma işlemi çoğunlukla sınıfların ve yöntemlerinin bire bir eşlemelerini içerir.
  • CAF Gönderen, Android SDK yöneticisi kullanılarak Google Play hizmetlerinin bir parçası olarak dağıtılmaya devam ediyor.
  • CAF Gönderen'e eklenen yeni paketler (com.google.android.gms.cast.framework.*), CCL ile benzer işlevlere sahiptir ve Google Cast Tasarımı kontrol listesine uymaktan sorumludur.
  • CAF Gönderen, Cast UX gereksinimlerine uyan widget'lar sağlar. Bu widget'lar CCL tarafından sağlananlara benzer.
  • CAF Gönderen, durumları izlemek ve verileri almak için CCL'ye benzer eşzamansız geri çağırmalar sağlar. CCL'nin aksine CAF Gönderen, çeşitli arayüz yöntemleri için işlemsiz uygulama sağlamaz.

Aşağıdaki bölümlerde çoğunlukla CCL'nin VideoCastManager'ına dayalı video merkezli uygulamalara odaklanacağız. Ancak çoğu durumda DataCastManager için de aynı kavramlar geçerlidir.

Bağımlılıklar

CCL ve CAF, AppCompat destek kitaplığı, MediaRouter v7 destek kitaplığı ve Google Play hizmetlerine aynı bağımlıları içerir. Ancak fark, CAF'nin Google Play Hizmetleri 9.2.0 veya sonraki sürümlerde kullanılabilen yeni Cast çerçevesine bağlı olmasıdır.

build.gradle dosyanızda com.google.android.gms:play-services-cast ve com.google.android.libraries.cast.companionlibrary:ccl bağımlılarını kaldırın, ardından yeni Cast çerçevesini ekleyin:

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

Ayrıca, Google Play hizmet meta verilerini de kaldırabilirsiniz:

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

CAF'nin parçası olan tüm hizmetler, etkinlikler ve kaynaklar uygulamanızın manifest dosyası ve kaynaklarıyla otomatik olarak birleştirilir.

CAF'nin desteklediği minimum Android SDK sürümü 9'dur (Gingerbread); CCL'nin minimum Android SDK sürümü 10'dur.

CCL, cihazda Google Play hizmetlerinin uyumlu bir sürümünün bulunduğunu doğrulamak için bir rahatlık yöntemi (BaseCastManager.checkGooglePlayServices(activity)) sağlar. CAF, bunu SDK SDK'nın bir parçası olarak sağlamaz. Güncellemeler tüm kullanıcılara hemen erişemeyebileceğinden, kullanıcının cihazına doğru Google Play Hizmetleri APK'sının yüklendiğinden emin olmak için Cihazların Google Play Hizmetleri APK'sına sahip olduğundan emin olma prosedürünü uygulayın.

Uygulamanın teması için yine de Theme.AppCompat varyantını kullanmanız gerekir.

Başlatma

CCL için, Uygulamalar örneğinin onCreate() yönteminde VideoCastManager.initialize() yönteminin çağrılması gerekiyordu. Bu mantık, Uygulama sınıfı kodunuzdan kaldırılmalıdır.

CAF'de Cast çerçevesi için açık bir ilk kullanıma hazırlama adımı da gerekir. Bu yöntem, CastContext tektonunu başlatmayı, alıcı uygulama kimliğini ve uygun diğer seçenekleri belirtmek için uygun bir OptionsProvider kullanmayı içerir. CastContext, müşterilerin etkileşimde bulunduğu bir tekton sağlayarak CCL'nin VideoCastManager sistemine benzer bir rol oynar. OptionsProvider, CCL'nin CastConfiguration özelliğine benzer şekilde Yayın çerçevesi özelliklerini yapılandırmanıza olanak tanır.

Mevcut CCL CastConfiguration.Builder şu şekildeyse:

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

Bu durumda, CAF'de CastOptions.Builder kullanan aşağıdaki CastOptionsProvider birbirine benzer olur:

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

OptionsProvider'ın tamamını uygulamak için örnek uygulamamıza göz atın.

AndroidManifest.xml dosyasının "application" öğesinde OptionsProvider'ı tanımlayın:

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

Her Activity öğesinin onCreate yönteminde CastContext öğesini geç başlatın (Application örneğinde değil):

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

CastContext tekli kullanımına erişmek için:

mCastContext = CastContext.getSharedInstance(this);

Cihaz bulma

CCL'nin VideoCastManager incrementUiCounter ve decrementUiCounter bu özellikleri Activities cihazınızın onResume ve onPause yöntemlerinden kaldırılmalıdır.

CAF'de, keşif süreci, uygulama ön plana gelip sırasıyla arka plana geçtiğinde çerçeve ile otomatik olarak başlatılır ve durdurulur.

Yayınla düğmesi ve Yayın iletişim kutusu

CCL'de olduğu gibi bu bileşenler, MediaRouter v7 destek kitaplığı tarafından sağlanır.

Yayınla düğmesi MediaRouteButton tarafından uygulanmaya devam eder ve etkinliğinize, menüdeki bir menü öğesi olarak (ActionBar veya Toolbar kullanılarak) eklenebilir.

Menü xml'sindeki MediaRouteActionProvider tanımı CCL ile aynı:

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

CCL'ye benzer şekilde, her etkinliğin onCreateOptionMenu() yöntemini geçersiz kılın, ancak CastManager.addMediaRouterButton kullanmak yerine MediaRouteButton'ı Cast çerçevesine bağlamak için CAF'nin CastButtonFactory'sini kullanın:

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

Cihaz kontrolü

CCL'ye benzer şekilde, CAF'de de cihaz denetimi büyük ölçüde çerçeve tarafından yönetilir. Gönderen uygulamanın cihaza bağlanmak ve GoogleApiClient uygulamasını kullanarak alıcı uygulamayı başlatmak zorunda kalmaması (ve işlemeyi denememesi) gerekir.

Gönderen ile alıcı arasındaki etkileşim artık "oturum" olarak gösterilir. SessionManager sınıfı, oturum yaşam döngüsünü yönetir ve kullanıcı hareketlerine göre oturumları otomatik olarak başlatıp durdurur: Kullanıcı, Yayın iletişim kutusunda Yayın cihazı seçtiğinde başlar ve kullanıcı, Yayın iletişim kutusundaki "Yayını Durdur" düğmesine dokunduğunda veya gönderen uygulamanın kendisi sonlandığında sona erer.

CCL'de, yayınlama oturumu durumunu izlemek için VideoCastConsumerImpl sınıfını genişletmeniz gerekir:

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

CAF'de gönderen uygulamasına, SessionManager ile bir SessionManagerListener kaydederek oturum yaşam döngüsü etkinlikleri hakkında bilgi verilebilir. SessionManagerHearer geri çağırmaları tüm oturum yaşam döngüsü etkinlikleri için geri çağırma yöntemlerini tanımlar.

Aşağıdaki SessionManagerListener yöntemleri, CCL'nin VideoCastConsumer arayüzünden eşleştirilir:

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

SessionManagerListener arayüzünü uygulayan bir sınıf tanımlayın ve VideoCastConsumerImpl mantığını eşleşen yöntemlere taşıyın:

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 sınıfı, yayın cihazıyla yapılan bir oturumu temsil eder. Sınıfta, cihaz ses düzeyini ve sesi kapatma durumlarını kontrol etme yöntemleri bulunur. CCL bu işlemleri BaseCastManager içerisinde gerçekleştirir.

Tüketici eklemek için CCL VideoCastManager yerine:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

Şimdi SessionManagerListener cihazınızı kaydedin:

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

CCL'de etkinlikleri dinlemeyi durdurmak için:

VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);

Oturum etkinliklerini dinlemeyi durdurmak için SessionManager uygulamasını kullanın:

mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
                    CastSession.class);

CCL ile yayın cihazı arasındaki bağlantıyı açıkça kesmek için:

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

CAF için SessionManager kullanın:

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

CCL, gönderenin alıcıya bağlanıp bağlanmadığını belirlemek için VideoCastManager.getInstance().isConnected() sunar ancak CAF'de SessionManager kullanın:

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

CAF'de, ses/sesi açma durum değişikliği bildirimleri yine de Cast.Listener içindeki geri çağırma yöntemleri aracılığıyla teslim edilir; bu dinleyiciler CastSession uygulamasına kaydedilir. Kalan tüm cihaz durumu bildirimleri CastStateListener geri çağırmaları aracılığıyla gönderilir; bu dinleyiciler CastSession uygulamasına kaydedilir. İlişkili parçalar, etkinlikler veya uygulamalar arka plana gittiğinde dinleyicilerin kaydını iptal etmeyi unutmayın.

Yeniden bağlantı mantığı

CAF, geçici kablosuz ağ sinyali veya diğer ağ hataları nedeniyle kaybolan ağ bağlantılarını yeniden kurmaya çalışır. Bu işlem artık oturum düzeyinde gerçekleştirilir. Bağlantı kaybedildiğinde oturum "askıya alındı" durumuna geçebilir ve bağlantı yeniden kurulduğunda "bağlı" durumuna geri döner. Bu çerçeve kapsamında, alıcı uygulamaya ve tüm Cast kanalları yeniden bağlanır.

CAF, kendi yeniden bağlantı oluşturma hizmetini sunar. Bu nedenle CCL ReconnectionService dosyasını manifest dosyanızdan kaldırabilirsiniz:

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

Ayrıca, yeniden bağlantı mantığı için manifestinizde aşağıdaki izinlere de ihtiyacınız yoktur:

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

CAF yeniden bağlantı hizmeti varsayılan olarak etkindir, ancak CastOptions kullanılarak devre dışı bırakılabilir.

Buna ek olarak, CAF varsayılan olarak etkinleştirilen (ve CastOptions aracılığıyla devre dışı bırakılabilir) otomatik oturum devam ettirmeyi de ekler. Gönderen uygulama arka plana gönderilirse veya kapatılırsa (kaydırarak ya da bir kilitlenme nedeniyle) otomatik olarak bir Yayınlama oturumu devam ederken çerçeve bu oturumu devam ettirmeye çalışır. Bu durumda, gönderen uygulaması ön plana geri döndüğünde veya yeniden başlatıldığında çerçeve bu oturuma devam etmeye çalışır. Bu işlem, uygun durumlarda SessionManager tarafından otomatik olarak gerçekleştirilir

Özel kanal kaydı

CCL, alıcıya özel mesaj kanalı oluşturmanın iki yolunu sunar:

  • CastConfiguration birden fazla ad alanı belirtmenizi sağlar. CCL bu kanalı sizin için oluşturur.
  • DataCastManager, VideoCastManager'a benzer ancak medya dışı kullanım alanlarına odaklanır.

Özel kanal oluşturmanın bu iki yöntemi de CAF tarafından desteklenmez. Bunun yerine, gönderen uygulamanız için Özel Kanal Ekleme prosedürünü uygulamanız gerekir.

CCL'ye benzer şekilde, medya uygulamaları için de medya kontrol kanalını açıkça kaydettirmeniz gerekmez.

Medya kontrolü

CAF'deki RemoteMediaClient sınıfı, VideoCastManager medya yöntemlerinin eşdeğeridir. RemoteMediaClient.Listener, VideoCastConsumer yöntemlerine eşdeğerdir. Özellikle VideoCastConsumer için onRemoteMediaPlayerMetadataUpdated ve onRemoteMediaPlayerStatusUpdated yöntemleri, sırasıyla RemoteMediaClient.Listener, onMetadataUpdated ve onStatusUpdated yöntemleriyle eşlenir.

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 nesnesinin açık bir şekilde başlatılması veya kaydedilmesi gerekmez. Bağlanan alıcı uygulamanın medya ad alanını desteklemesi durumunda, çerçeve otomatik olarak nesneyi başlatır ve temel medya kanalını oturum başlangıç zamanında kaydeder.

RemoteMediaClient özelliğine CastSession nesnesinin getRemoteMediaClient yöntemi olarak erişilebilir.

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

CCL'ler yerine:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

Şimdi CAF'yi kullanın:

mRemoteMediaClient.addListener(mRemoteMediaClientListener);

RemoteMediaClient ile herhangi bir sayıda dinleyici kaydedilebilir. Böylece birden fazla gönderen bileşeni, oturumla ilişkilendirilen tek RemoteMediaClient örneğini paylaşabilir.

CCL'nin VideoCastManager politikası, medya oynatmayı yönetme yöntemlerini sunar:

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

Bunlar artık CAF'deki RemoteMediaClient tarafından uygulanır:

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

CAF'de, RemoteMediaClient tarihinde yayınlanan tüm medya istekleri, isteğin ilerleme durumunu ve nihai sonucunu izlemek için kullanılabilecek bir PendingResult geri çağırması ile RemoteMediaClient.MediaChannelResult döndürür.

Hem CCL hem de CAF, medya öğelerini temsil etmek ve medya yüklemek için MediaInfo ve MediaMetadata sınıflarını kullanır.

CCL'de medya yüklemek için VideoCastManager kullanılır:

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

CAF'de, medyayı yüklemek için RemoteMediaClient kullanılır:

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

CCL, alıcıdaki mevcut bir medya oturumunun Media bilgilerini ve durumunu almak için VideoCastManager özelliğini kullanır:

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

Aynı bilgileri almak için CAF'deki RemoteMediaClient simgesini kullanın:

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

Tanıtım amaçlı yer paylaşımı

CCL'ye benzer şekilde, CAF de kullanıcıya ilk gösterildiğinde Yayınla düğmesinin vurgulanacağı özel bir IntroductoryOverlay görünümü sağlar.

Yer paylaşımının ne zaman gösterileceğini öğrenmek için CCL'nin VideoCastConsumer onCastAvailabilityChanged yöntemini kullanmak yerine, Yayın cihazları MediaRouter tarafından yerel ağda keşfedildikten sonra Yayın düğmesinin ne zaman görüneceğini belirlemek için bir CastStateListener belirtin:

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 örneğini takip edin:

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

Tanıtım yer paylaşımının gösterilmesi için MediaRouteButton öğesinin görünür olup olmadığını kontrol edin:

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

Tanıtım yer paylaşımının gösterilmesine ilişkin eksiksiz kod için örnek uygulamamıza göz atın.

Tanıtım yer paylaşımının stilini özelleştirmek için Tanıtım Yer Paylaşımını Özelleştirme prosedürünü uygulayın.

Mini kumanda

CCL'nin MiniController yerine, mini denetleyiciyi göstermek istediğiniz etkinliklerin uygulama düzeni dosyanızda CAF'nin MiniControllerFragment özelliğini kullanın:

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

CAF, CCL'nin MiniController desteği olan manuel yapılandırmayı ve ayrıca Autoplay özelliğini desteklemez.

Mini kumandanın stilini ve düğmelerini özelleştirmek için Mini Kumandayı Özelleştirme prosedürünü uygulayın.

Bildirim ve kilit ekranı

CCL'nin VideoCastNotificationService uygulamasına benzer şekilde CAF, yayınlama sırasında medya bildirimlerinin görünümünü yönetmek için bir MediaNotificationService sağlar.

Aşağıdakileri manifest dosyanızdan kaldırmanız gerekiyor:

  • VideoIntentReceiver
  • VideoCastNotificationService

CCL, CAF tarafından desteklenmeyen CastConfiguration.Builder ile özel bir bildirim hizmeti sunmayı destekler.

CCL kullanarak aşağıdaki CastManager öğesini başlatmayı değerlendirin:

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, CAF'deki eşdeğer yapılandırma için gönderen uygulamasına bildirim ve kilit ekranı ile ilgili medya kontrolleri oluşturmanıza yardımcı olmak üzere bir NotificationsOptions.Builder sağlar. Bildirim ve kilit ekranı kontrolleri, CastContext başlatılırken CastOptions ile etkinleştirilebilir.

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

Bildirimler ve kilit ekranı kontrolleri CAF'de her zaman etkindir. Ayrıca, oynat/duraklat ve yayını durdur düğmelerinin varsayılan olarak sağlandığını unutmayın. CAF, medya bildiriminin ne zaman gösterileceğini belirlemek için Etkinliklerin görünürlüğünü otomatik olarak izler (Gingerbread hariç). (Gingerbread için registerLifecycleCallbacksBeforeIceCreamSandwich() kullanmayla ilgili önceki notu inceleyin; CCL'nin VideoCastManager incrementUiCounter ve decrementUiCounter çağrıları kaldırılmalıdır.)

Bildirimlerde gösterilen düğmeleri özelleştirmek için Bildirim ve Kilit Ekranına Medya Kontrolleri Ekleme prosedürünü uygulayın.

Genişletilmiş kumanda

CCL, medya yayınlarken genişletilmiş kumandayı göstermek için VideoCastControllerActivity ve VideoCastControllerFragment özelliklerini sağlar.

VideoCastControllerActivity bildirimini manifestten kaldırabilirsiniz.

CAF'de ExpandedControllerActivity uzantısını genişletip Yayınla düğmesini eklemeniz gerekir.

Genişletilmiş kumandada görüntülenen stilleri ve düğmeleri özelleştirmek için Genişletilmiş Denetleyiciyi Özelleştir prosedürünü uygulayın.

Ses odağı

CCL'de olduğu gibi ses odağı otomatik olarak yönetilir.

Ses düzeyi kontrolü

Gingerbread için CCL'de olduğu gibi dispatchKeyEvent gereklidir. ICS ve sonraki sürümlerde hem CCL hem de CAF ses seviyesi kontrolü otomatik olarak işlenir.

CAF, uygulama etkinliklerinizin içindeki telefondaki ses seviyesi düğmesini kullanarak yayınlama ses düzeyini kontrol etmenizi sağlar ve ayrıca, desteklenen sürümlerde yayın yaparken görsel bir ses çubuğu gösterir. Uygulamanızın önünde, kilitli olsa veya ekran kapalı olsa bile CAF kesin ses seviyesiyle ses değişikliğini de yönetir.

Altyazılar

Android KitKat ve sonraki sürümlerde altyazılar, Ayarlar > Erişilebilirlik bölümünün altında bulunan Altyazı Ayarları'ndan özelleştirilebilir. Ancak Android'in önceki sürümlerinde bu işlev yoktur. CCL, bunu önceki sürümler için özel ayarlar sağlayarak ve KitKat ve sonraki sürümlerdeki sistem ayarlarına yetki vererek yürütür.

CAF, altyazı tercihlerini değiştirmek için özel ayarlar sağlamaz. Manifest'inizdeki CaptionsPreferenceActivity referanslarını ve tercihler XML'inizi kaldırmanız gerekir.

Altyazıların değiştirilmesi, genişletilmiş kumanda kullanıcı arayüzü tarafından işlendiğinden CCL'nin TracksChooserDialog aracı artık gerekli değil.

CAF'deki altyazı API'si v2'ye benzer.

Hata ayıklama günlük kaydı

CAF, hata ayıklama günlük kaydı ayarları sağlamaz.

Çeşitli

Aşağıdaki CCL özellikleri CAF'de desteklenmez:

  • MediaAuthService sağlayarak oynatma öncesinde yetkilendirme alma
  • Yapılandırılabilir kullanıcı arayüzü mesajları

Örnek uygulamalar

Android için Universal Music Player (uamp) örnek uygulamamızı CCL'den CAF'ye taşımak üzere diff'ye göz atın.

Ayrıca CAF kullanan codelab eğitimlerimiz ve örnek uygulamalarımız da mevcuttur.