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.