CastPlayer, hem yerel oynatmayı hem de uzak bir Cast özellikli cihaza yayınlamayı destekleyen bir Jetpack Media3 Player uygulamasıdır. CastPlayer
Uygulamanıza yayın işlevi eklemeyi kolaylaştırır ve yerel ile uzaktan oynatma arasında sorunsuz geçiş yapmanızı sağlayan zengin özellikler sunar. Bu kılavuzda, CastPlayer'i medya uygulamanıza nasıl entegre edeceğiniz gösterilmektedir.
Cast'i diğer platformlarla entegre etmek için Cast SDK'ya bakın.
CastPlayer'ı bağımlılık olarak ekleme
CastPlayer'ı kullanmaya başlamak için uygulama modülünüzün build.gradle dosyasına ihtiyacınız olan AndroidX Media3 ve CastPlayer bağımlılıklarını ekleyin.
Kotlin
implementation("androidx.media3:media3-exoplayer:1.9.0")
implementation("androidx.media3:media3-ui:1.9.0")
implementation("androidx.media3:media3-session:1.9.0")
implementation("androidx.media3:media3-cast:1.9.0")
Groovy
implementation "androidx.media3:media3-exoplayer:1.9.0"
implementation "androidx.media3:media3-ui:1.9.0"
implementation "androidx.media3:media3-session:1.9.0"
implementation "androidx.media3:media3-cast:1.9.0"
CastPlayer'ınızı yapılandırma
CastPlayer uygulamasını yapılandırmak için AndroidManifest.xml dosyanızı bir seçenek sağlayıcıyla güncelleyin.
Seçenek sağlayıcı
CastPlayer, davranışını yapılandırmak için bir seçenek sağlayıcı gerektirir. Temel kurulum için AndroidManifest.xml dosyanıza ekleyerek varsayılan sağlayıcı seçeneklerini kullanabilirsiniz. Bu işlemde, varsayılan alıcı uygulaması da dahil olmak üzere varsayılan ayarlar kullanılır.
<application>
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
</application>
Yapılandırmayı özelleştirmek için kendi özel OptionsProvider'nizi uygulayın. Bunun nasıl yapılacağını öğrenmek için CastOptions kılavuzuna bakın.
Medya aktarımları için alıcı ekleme
Manifestinize MediaTransferReceiver eklediğinizde, sistem kullanıcı arayüzü, uygulama etkinliğini açmadan medyayı yeniden yönlendirebilir. Örneğin, bir kullanıcı uygulamanızın medyalarını oynatan cihazı medya bildiriminden değiştirebilir.
<application>
<receiver android:name="androidx.mediarouter.media.MediaTransferReceiver" />
</application>
CastPlayer oluşturma
Cast ile uzaktan oynatma için uygulamanız, kullanıcı uygulamanızdaki bir Etkinlik ile etkileşimde bulunmadığında bile (ör. sistem medya bildirimi aracılığıyla) oynatmayı yönetebilmelidir. Bu nedenle, ExoPlayer (yerel oynatma için) ve CastPlayer örneklerinizi MediaSessionService veya MediaLibraryService gibi bir hizmette oluşturmanız gerekir. Öncelikle ExoPlayer örneğinizi oluşturun. Ardından CastPlayer örneğinizi oluştururken ExoPlayer'ı yerel oynatıcı örneği olarak ayarlayın. Böylece Media3, çıkış rotası yerelden uzağa veya uzaktan yerel olarak değiştiğinde oynatıcı aktarımlarını işleyebilir.
Kotlin
override fun onCreate() { super.onCreate() val exoPlayer = ExoPlayer.Builder(context).build() val castPlayer = CastPlayer.Builder(context) .setLocalPlayer(exoPlayer) .build() mediaSession = MediaSession.Builder(context, castPlayer).build() }
Java
@Override public void onCreate() { super.onCreate(); ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build(); CastPlayer castPlayer = new CastPlayer.Builder(context) .setLocalPlayer(exoPlayer) .build(); mediaSession = new MediaSession.Builder( /* context= */ context, /* player= */ castPlayer).build(); }
Kullanıcı arayüzü öğeleri ekleme
Kullanıcıların yayın cihazı seçmesine olanak tanımak için uygulamanızın kullanıcı arayüzüne MediaRouteButton ekleyin.
Bu bölümde, düğmeyi nasıl ekleyeceğiniz ve oynatma yerel ile uzak cihazlar arasında değiştiğinde kullanıcı arayüzünüzü güncellemek için etkinlikleri nasıl dinleyeceğiniz gösterilmektedir.
MediaRouteButton'u ayarlama
Kullanıcıların etkileşimde bulunması için etkinliğinizin kullanıcı arayüzüne MediaRouteButton eklemenin dört olası yöntemi vardır. Seçim, oynatıcı etkinliğinizin kullanıcı arayüzünün nasıl görünmesini ve çalışmasını istediğinize bağlıdır.
Oynatıcıya Composable medya rotası düğmesi ekleme
MediaRouteButton composable'ı oynatıcınızın kullanıcı arayüzüne ekleyebilirsiniz. Daha fazla bilgi için oluşturma kılavuzuna bakın.
Kotlin
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.media3.cast.MediaRouteButton @Composable fun PlayerComposeView(player: Player, modifier: Modifier = Modifier) { var controlsVisible by remember { mutableStateOf(false) } Box( modifier = modifier.clickable { controlsVisible = true }, contentAlignment = Alignment.Center, ) { PlayerSurface(player = player, modifier = modifier) AnimatedVisibility(visible = controlsVisible, enter = fadeIn(), exit = fadeOut()) { Box(modifier = Modifier.fillMaxSize()) { MediaRouteButton(modifier = Modifier.align(Alignment.TopEnd)) PrimaryControls(player = player, modifier = Modifier.align(Alignment.Center)) } } } } @Composable fun PrimaryControls(player: Player, modifier: Modifier = Modifier) { ... }
Medya rotası düğmesini PlayerView'a ekleyin.
MediaRouteButton simgesini doğrudan PlayerView'ın kullanıcı arayüzü kontrollerine ekleyebilirsiniz. MediaController'ı PlayerView için oynatıcı olarak ayarladıktan sonra, oynatıcıda Cast düğmesini göstermek için MediaRouteButtonViewProvider sağlayın.
Kotlin
override fun onStart() { super.onStart() playerView.player = mediaController playerView.setMediaRouteButtonViewProvider(MediaRouteButtonViewProvider()) }
Java
@Override public void onStart() { super.onStart(); playerView.setPlayer(mediaController); playerView.setMediaRouteButtonViewProvider(new MediaRouteButtonViewProvider()); }
Uygulama çubuğu menüsüne medya rotası düğmesini ekleme
Bu yöntem, uygulama çubuğu menüsünde bir medya rotası düğmesi oluşturur. Bu düğme stilinin gösterilmesi için hem manifest dosyasında hem de Activity içinde güncellemeler yapılması gerekir.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/media_route_menu_item"
android:title="@string/media_route_menu_title"
app:showAsAction="always"
app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
</menu>
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { ... menuInflater.inflate(R.menu.sample_media_route_button_menu, menu) val menuItemFuture: ListenableFuture<MenuItem> = MediaRouteButtonFactory.setUpMediaRouteButton( context, menu, R.id.media_route_menu_item) Futures.addCallback( menuItemFuture, object : FutureCallback<MenuItem> { override fun onSuccess(menuItem: MenuItem?) { // Do something with the menu item. } override fun onFailure(t: Throwable) { // Handle the failure. } }, executor) ... }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { ... getMenuInflater().inflate(R.menu.sample_media_route_button_menu, menu); ListenableFuture<MenuItem> menuItemFuture = MediaRouteButtonFactory.setUpMediaRouteButton( context, menu, R.id.media_route_menu_item); Futures.addCallback( menuItemFuture, new FutureCallback<MenuItem>() { @Override public void onSuccess(MenuItem menuItem) { // Do something with the menu item. } @Override public void onFailure(Throwable t) { // Handle the failure. } }, executor); ... }
Medya rotası düğmesini Görünüm olarak ekleme
Alternatif olarak, activity_layout.xml dosyanızda MediaRouteButton oluşturabilirsiniz. MediaRouteButton kurulumunu tamamlamak için Activity kodunuzda Media3
Cast MediaRouteButtonFactory'i kullanın.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) findViewById<MediaRouteButton>(R.id.media_route_button)?.also { val unused = MediaRouteButtonFactory.setUpMediaRouteButton(context, it) } }
Java
@Override public void onCreate(Bundle savedInstanceState) { ... MediaRouteButton button = findViewById(R.id.media_route_button); ListenableFuture<Void> setUpFuture = MediaRouteButtonFactory.setUpMediaRouteButton(context, button); }
Etkinlik İşleyici
Medya oynatma konumundaki değişiklikleri dinlemek için Player.Listener oluşturun.Activity playbackType PLAYBACK_TYPE_LOCAL ile PLAYBACK_TYPE_REMOTE arasında değiştiğinde kullanıcı arayüzünüzü gerektiği gibi ayarlayabilirsiniz. Bellek sızıntılarını önlemek ve dinleyici etkinliğini yalnızca uygulamanız görünürken sınırlandırmak için dinleyiciyi onStart içinde kaydedin ve onStop içinde kaydını silin:
Kotlin
import androidx.media3.common.DeviceInfo import androidx.media3.common.Player private val playerListener: Player.Listener = object : Player.Listener { override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) { if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) { // Add UI changes for local playback. } else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) { // Add UI changes for remote playback. } } } override fun onStart() { super.onStart() mediaController.addListener(playerListener) } override fun onStop() { super.onStop() mediaController.removeListener(playerListener) }
Java
import androidx.media3.common.DeviceInfo; import androidx.media3.common.Player; private Player.Listener playerListener = new Player.Listener() { @Override public void onDeviceInfoChanged(DeviceInfo deviceInfo) { if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) { // Add UI changes for local playback. } else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) { // Add UI changes for remote playback. } } }; @Override protected void onStart() { super.onStart(); mediaController.addListener(playerListener); } @Override protected void onStop() { super.onStop(); mediaController.removeListener(playerListener); }
Oynatma etkinliklerini dinleme ve bunlara yanıt verme hakkında daha fazla bilgi için oynatıcı etkinlikleri kılavuzuna bakın.