CCL Sender App'i Cast Application Framework'e (CAF) Taşıma

Aşağıdaki prosedür, Android gönderen uygulamanızı CCL ile SDK v2'yi CAF'ye yayınlayın. CCL'nin tüm işlevleri CAF'de uygulanır. Bu nedenle, taşıma işleminden sonra CCL 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. bir Cast uygulaması geliştirmeyi basitleştirir.

Giriş

  • CAF Sender tasarımı, Cast Companion Kitaplığı'ndan etkilendiği için CCL'den CAF Sender'a taşıma işlemi çoğunlukla ve yöntemlerini inceleyeceğiz.
  • CAF Sender, Google Play Hizmetleri'nin bir parçası olarak dağıtılmaya devam ediyor kullanarak e-posta gönderebilirsiniz.
  • Baştan sona yeni paketler (com.google.android.gms.cast.framework.*) CAF Sender'a eklenen bu özellik, CCL'ye benzer işlevlerle uymakla yükümlüdür Google Cast Tasarımı kontrol listesi.
  • CAF Sender, Cast kullanıcı deneyimi şartlarına uygun widget'lar sağlar; bu widget'lar CCL tarafından sağlananlara benzer.
  • CAF Gönderen; web sitesindeki verileri ve verileri nasıl alacağınızı öğreneceksiniz. CAF Sender, CCL'den farklı olarak ve çeşitli arayüz yöntemlerinin nasıl uygulandığını öğreneceksiniz.

İlerleyen bölümlerde, temel olarak video merkezli CCL'nin VideoCastManager'ına dayanır ancak çoğu durumda Kavramlar DataCastManager için de geçerlidir.

Bağımlılıklar

CCL ve CAF, AppCompat destek kitaplığında aynı bağımlılıklara sahiptir. MediaRouter v7 destek kitaplığı ve Google Play hizmetleri. Ancak aradaki fark CAF, Google Play'de bulunan yeni Cast çerçevesine bağlı. Hizmetler 9.2.0 veya sonraki sürümler için geçerlidir.

Build.gradle dosyanızda şu bağımlılıkları kaldırın: com.google.android.gms:play-services-cast ve com.google.android.libraries.cast.companionlibrary:ccl, sonra 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'
}

Google Play hizmeti meta verilerini de kaldırabilirsiniz:

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

CAF kapsamındaki tüm hizmetler, etkinlikler ve kaynaklar otomatik olarak Uygulamanızın manifest dosyası ve kaynaklarıyla birleştirildi.

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

CCL size kolaylık sağlayan bir yöntem sunar. BaseCastManager.checkGooglePlayServices(activity) gibi bir ürünle uyumlu bir Google Play Hizmetleri'nin sürümü cihazda mevcut. CAF şunları yapmaz: bunu Cast SDK'sının bir parçası olarak sağlar. Prosedürü uygulayın Cihazlarda Google Play Hizmetleri APK'sının olduğundan emin olma Google Play Hizmetleri APK'sının kullanıcının Güncellemeler tüm kullanıcılara hemen ulaşmayabilir.

Uygulamanın tıklayın.

Başlatma

CCL için VideoCastManager.initialize() öğesinin Applications örneğinin onCreate() yöntemi. Bu mantık Uygulama sınıf kodunuzdan kaldırılır.

CAF'de, Cast için açık bir başlatma adımı da gereklidir bahsedeceğim. Bu işlem, CastContext single'ını bir alıcı uygulama kimliğini ve alıcı uygulama kimliğini belirtmek için uygun OptionsProvider diğer global seçenekler. CastContext, CCL'lerinkine benzer bir rol oynar. Müşterilerin etkileşim kurabileceği bir tek bağlantı sağlayarak VideoCastManager. OptionsProvider, CCL'nin CastConfiguration öğesine benzer niteliktedir. Böylece size Cast çerçevesi özelliklerini yapılandırmak için kullanılır.

Mevcut CCL CastConfiguration.Builder metriğiniz şu şekilde görünüyorsa:

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

Ardından CAF'de CastOptions.Builder kullanılarak aşağıdaki CastOptionsProvider şöyle 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;
    }
}

Örnek uygulamamıza göz atın Seçenekler Sağlayıcısı'nın eksiksiz bir şekilde uygulanması için gereklidir.

OptionProvider öğesini "application" (uygulama) içinde bildir elemanı AndroidManifest.xml dosyası:

<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 bir Activity öğesinin onCreate yönteminde CastContext öğesini geç başlat (Application örneği değil):

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

CastContext single'ına erişmek için:

mCastContext = CastContext.getSharedInstance(this);

Cihaz bulma

CCL'nin VideoCastManager incrementUiCounter ve decrementUiCounter Activities, onResume ve onPause yöntemlerinden kaldırılacak.

CAF'de keşif süreci Google Ads tarafından arka plana gittiğinde arka planda çalışır. tıklayın.

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

CCL'de olduğu gibi bu bileşenler MediaRouter v7 desteği tarafından sağlanır. kitaplığını açar.

Yayınla düğmesi MediaRouteButton tarafından hâlâ kullanılıyor ve eklenebilir etkinliğinize (ActionBar veya Toolbar kullanarak) bir menü öğesi olarak kullanabilirsiniz.

XML menüsündeki MediaRouteActionProvider bildirimi aynı CCL ile:

<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 bir Etkinliğin onCreateOptionMenü() yöntemini geçersiz kılın ancak CastManager.addMediaRouterButton kullanmak yerine CAF'nin CastButtonFactory'yi kullanın MediaRouteButton'ı Cast çerçevesine bağlamak için:

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 cihaz kontrolü de büyük ölçüde çerçeve tarafından yönetilir. Gönderen uygulamanın, cihaza bağlanıp alıcı uygulamayı başlatmak için GoogleApiClient

Gönderen ve alıcı arasındaki etkileşim artık bir "oturum" olarak temsil edilmektedir. İlgili içeriği oluşturmak için kullanılan SessionManager sınıfı, oturum yaşam döngüsünü işler ve otomatik olarak başlar. ve kullanıcı hareketlerine yanıt olarak oturumları durdurur: Kullanıcı, Yayın iletişim kutusunda bir Yayın cihazı seçer ve kullanıcı dokunduğunda sona erer "Yayını Durdur" düğmesini seçtiğinizde, yayın iletişim kutusunda veya gönderen uygulamasının kendisi feshedilir.

CCL'de yayını takip etmek için VideoCastConsumerImpl sınıfını genişletmeniz gerekir oturum durumu:

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 uygulamaya, oturum yaşam döngüsü olayları hakkında SessionManager ile SessionManagerListener kaydettirme. İlgili içeriği oluşturmak için kullanılan SessionManagerListener geri çağırmaları tüm oturum için geri çağırma yöntemlerini tanımlar yaşam döngüsü olayları.

Aşağıdaki SessionManagerListener yöntem, CCL'lerden eşlenir VideoCastConsumer arayüzü:

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

SessionManagerListener arayüzünü uygulayan bir sınıf bildir ve taşı eşleştirme yöntemleri için VideoCastConsumerImpl mantığı:

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ı içeren bir oturumu temsil ediyor. Sınıfta kontrol etmek için nasıl kullanacağınızı göstereceğim. CCL BaseCastManager

Tüketici eklemek için CCL VideoCastManager kullanmak 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'deki etkinlikleri dinlemeyi durdurmak için:

VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);

Şimdi SessionManager uygulamasını kullanarak oturum etkinliklerini dinlemeyi durdurun:

mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
                    CastSession.class);

Yayın cihazıyla olan bağlantıyı açıkça kesmek için CCL şunları kullandı:

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

CAF için SessionManager değerini kullanın:

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

CCL, gönderenin alıcıyla bağlantılı olup olmadığını belirlemek için VideoCastManager.getInstance().isConnected() ancak CAF'de SessionManager:

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

CAF'de ses düzeyi/sesi durumu değişikliği bildirimleri, geri arama aracılığıyla teslim edilmeye devam eder Cast.Listener kapsamındaki yöntemler; kayıtlı olduğu kadar CastSession. Diğer cihaz durumu bildirimlerinin tümü CastStateListener geri arama; bu dinleyiciler de CastSession. İlişkili olduğunda dinleyicilerin kaydını iptal ettiğinizden emin olun. parçaların, etkinliklerin veya uygulamaların arka plana gitmesini sağlayabilirsiniz.

Yeniden bağlanma mantığı

CAF, nedeniyle kaybedilen ağ bağlantılarını yeniden kurmaya çalışıyor kablosuz sinyal kaybı veya diğer ağ hatalarına neden olabilir. Bu artık oturum düzeyi; bir oturum "askıya alınmış" bağlantı kurulduğunda, kayboldu ve tekrar "bağlı" durumuna geçecek bağlantının kurulduğu durumdaki durum geri yüklendi. Çerçeve, alıcı uygulamanın yeniden bağlanmasını sağlar bu işlemin bir parçası olarak tüm Cast kanallarını yeniden bağlamanız gerekir.

CAF, kendi yeniden bağlantı hizmetini sağlar. Böylece, manifest dosyanızdaki CCL ReconnectionService bilgisini girin:

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

Ayrıca, yeniden bağlanma mantığı:

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

CAF yeniden bağlanma hizmeti varsayılan olarak etkindir, ancak CastOptions

Ayrıca, CAF, bir kullanıcı tarafından etkinleştirilen otomatik oturum devam ettirme işlevi de ekler. varsayılandır (ve CastOptions aracılığıyla devre dışı bırakılabilir). Gönderen uygulama Kullanıcı arka plana gönderilirse veya cihaz sonlandırılırsa (hızlıca kaydırılarak veya kilitlenme nedeniyle) bir Cast oturumu devam ederken çerçeve, bunu devam ettirmeye çalışır. Gönderen uygulaması ön plana geri döndüğünde veya yeniden başlatıldığında oturum; bu işlem, SessionManager tarafından otomatik olarak gerçekleştirilecek ve kayıtlı SessionManagerListener örneklerinde uygun geri çağırmalar yapılır.

Özel kanal kaydı

CCL, alıcıya yönelik özel bir mesaj kanalı oluşturmak için iki yol sunar:

  • CastConfiguration birden fazla ad alanı belirtmenize olanak tanır ve CCL sizin için kanal oluşturun.
  • DataCastManager, VideoCastManager'a benzer ancak medya dışı içeriklere odaklanıyor örnekler üzerinden görüntüleyebilirsiniz.

Özel kanal oluşturma yöntemlerinin ikisi de CAF tarafından desteklenmez. talimatları uygulamak yerine Özel Kanal ekleme gönderin.

CCL'ye benzer şekilde, medya uygulamaları için de Medya kontrol kanalını kaydedin.

Medya kontrolü

CAF'de RemoteMediaClient sınıfı VideoCastManager ile eşdeğerdir medya yöntemleri. RemoteMediaClient.Listener, eşdeğerdir VideoCastConsumer yöntem. Özellikle, onRemoteMediaPlayerMetadataUpdated onRemoteMediaPlayerStatusUpdated VideoCastConsumer yöntemlerinin onMetadataUpdated ve Sırasıyla RemoteMediaClient.Listener için onStatusUpdated yöntem:

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 öğesini açıkça başlatmanız veya kaydetmeniz gerekmez. nesne; çerçeve, nesneyi otomatik olarak örneklendirir ve alıcı uygulama ise oturum başlangıç zamanında temel medya kanalı medya ad alanını destekler.

RemoteMediaClient, öğesinin getRemoteMediaClient yöntemi olarak erişilebilir CastSession nesnesini tanımlayın.

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, istediğiniz sayıda dinleyiciye Bu, birden fazla gönderen bileşeninin tek bir RemoteMediaClient (oturumla ilişkilendirilen).

CCL'nin VideoCastManager özelliği, medya oynatma işlemini işlemeye yönelik yöntemler sunar:

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

Bunlar artık CAF'de RemoteMediaClient tarafından uygulanmaktadır:

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

CAF'de, RemoteMediaClient tarihinde yayınlanan tüm medya istekleri bir PendingResult geri araması ile RemoteMediaClient.MediaChannelResult Bu, talebin ilerlemesini ve nihai sonucunu izlemek için kullanılabilir.

Hem CCL hem de CAF, değeri göstermek için MediaInfo ve MediaMetadata sınıflarını medya öğelerini kullanabilirsiniz.

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

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

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

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

Mevcut bir medya oturumunun Media bilgilerini ve durumunu alıcı, CCL VideoCastManager kullanır:

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

CAF'de aynı bilgileri almak için RemoteMediaClient öğesini kullanın:

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

Tanıtım yer paylaşımı

CCL'ye benzer şekilde CAF de vurgulanacak özel bir görünüm IntroductoryOverlay sağlar kullanıcılara ilk kez gösterildiğinde Yayınla düğmesi.

CCL'nin VideoCastConsumer onCastAvailabilityChanged yöntemini kullanmak yerine yer paylaşımını ne zaman görüntüleyeceğini belirlemek için bir CastStateListener bildiriminde bulunun. Google Cast düğmesi görünür hale geldiğinde, yerel ağ: 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 ö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 şunlar gösterilebilir:

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

Şu bölüme göz atın: örnek uygulama giriş yer paylaşımını gösteren çalışma kodunun tamamı için.

Tanıtım yer paylaşımının stilini özelleştirmek için aşağıdaki prosedürü izleyin: Tanıtım Yer Paylaşımını özelleştirin.

Mini kumanda

CCL MiniController yerine CAF MiniControllerFragment kullanın miniyi göstermek istediğiniz etkinliklerin uygulama düzen dosyası denetleyici:

<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 tarafından desteklenen manuel yapılandırmayı desteklemiyor ve Autoplay özelliğini desteklemez.

Mini kumandanın stilini ve düğmelerini özelleştirmek için ameliyat Mini Kumanda'yı özelleştirin.

Bildirim ve kilit ekranı

CCL'nin VideoCastNotificationService çözümüne benzer şekilde, CAF bir Medya bildirimlerinin görünümünü yönetmek için MediaNotificationService yayın sırasında.

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

  • VideoIntentReceiver
  • VideoCastNotificationService

CCL, CastConfiguration.Builder; bu reklam biçiminin desteklenmediğini varsayalım.

CCL kullanarak CastManager ilk kullanıma hazırlamayı deneyin:

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 NotificationsOptions.Builder bildirimi ve kilit ekranını gönderen uygulamasına yükleyebilirsiniz. Bildirim ve kilit ilk kullanıma hazırlanırken ekran denetimleri CastOptions ile etkinleştirilebilir 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'de bildirimler ve kilit ekranı kontrolleri her zaman etkindir. Ayrıca, oynatma/duraklatma ve yayını durdurma düğmeleri varsayılan olarak sağlanır. CAF karar vermek için Etkinliklerin görünürlüğünü otomatik olarak izler. Gingerbread hariç medya bildiriminin ne zaman görüntüleneceğini belirler. (Gingerbread için şurada önceki nota bakın: registerLifecycleCallbacksBeforeIceCreamSandwich() kullanılıyor; CCL'ler VideoCastManager incrementUiCounter ve decrementUiCounter araması kaldırılmalıdır.)

Bildirimlerde görüntülenen düğmeleri özelleştirmek için şu talimatları uygulayın: ameliyat Bildirim ve Kilit Ekranına Medya Denetimleri ekleyin.

Genişletilmiş denetleyici

CCL, VideoCastControllerActivity ve VideoCastControllerFragment sağlar görüntüleyebilirsiniz.

Manifest'ten VideoCastControllerActivity beyanını kaldırabilirsiniz.

CAF'de şunları yapmanız gerekir: GenişletilmişControllerActivity öğesini genişletin ve Yayınla düğmesini ekleyin.

Genişletilmiş aşağıdaki adımları izleyin, Genişletilmiş Denetleyici'yi özelleştirin.

Ses odağı

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

Ses düzeyi kontrolü

Gingerbread için de CCL'de olduğu gibi dispatchKeyEvent gereklidir. ICS ve üzeri hem CCL hem de CAF ses düzeyi denetimi otomatik olarak işlenir.

CAF, yayın ses düzeyinin cihazındaki sabit ses düğmesiyle kontrol edilmesini sağlar. ve ayrıca, etkinleştirildiğinde bir görsel ses çubuğu yayınlama özelliğini destekler. CAF ayrıca uygulamanız önde değilken, kilitli olsa bile veya ekran kapalıyken bile sabit ses kapalı.

Altyazılar

Android KitKat ve sonraki sürümlerde altyazılar, Altyazılar aracılığıyla özelleştirilebilir Ayarlar'a gidin ve Ayarlar > Erişilebilirlik. Android'in önceki sürümleri, ancak bu özelliğe sahip değildir. CCL bunun yerine özel ve KitKat'ın sistem ayarlarına erişim yetkisi verme ve üzeri.

CAF, altyazı tercihlerini değiştirmek için özel ayarlar sağlamaz. Siz manifest dosyanızdaki CaptionsPreferenceActivity referanslarını kaldırmalıdır ve tercihlerinizin XML'idir.

Kapatılan e-posta adresi değiştirildiğinden CCL'nin TracksChooserDialog değeri artık gerekli değil Altyazı kanalları, genişletilmiş denetleyici kullanıcı arayüzü tarafından işlenir.

closed captioning API v2'ye benzerdir.

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:

  • Bir MediaAuthService sağlayarak oynatmadan önce yetkilendirme alma
  • Yapılandırılabilir kullanıcı arayüzü mesajları

Örnek uygulamalar

Universal Music Player for Android (uamp) örnek uygulamamızı CCL'den CAF'ye taşımanın farklarına bakın.

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