CastPlayer'ı kullanmaya başlama

CastPlayer, hem yerel oynatmayı hem de uzaktaki Cast özellikli bir 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-alpha01")
implementation("androidx.media3:media3-ui:1.9.0-alpha01")
implementation("androidx.media3:media3-session:1.9.0-alpha01")
implementation("androidx.media3:media3-cast:1.9.0-alpha01")

Groovy

implementation "androidx.media3:media3-exoplayer:1.9.0-alpha01"
implementation "androidx.media3:media3-ui:1.9.0-alpha01"
implementation "androidx.media3:media3-session:1.9.0-alpha01"
implementation "androidx.media3:media3-cast:1.9.0-alpha01"

CastPlayer'ı uygulamanıza entegre edebilmek için en son alfa sürümünü bulmak üzere Jetpack Media sürüm notlarına bakın. Tüm modüller aynı sürümde olmalıdır.

Kullanılabilir kitaplık modülleri hakkında daha fazla bilgi için Google Maven AndroidX Media3 sayfasını inceleyin.

CastPlayer'ınızı yapılandırma

CastPlayer 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ı medya bildiriminden uygulamanızın medyalarını oynatan cihazı 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 (uzaktan oynatma için) ö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 MediaRouteButton'ı etkinliğinizin kullanıcı arayüzüne eklemenin dört olası yöntemi vardır. Bu seçim, oynatma 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 öğesini doğrudan PlayerView'ın kullanıcı arayüzü kontrollerinden ekleyebilirsiniz. MediaControllerPlayerView 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, etkinlik düzeninizde MediaRouteButton oluşturabilirsiniz. MediaRouteButton kurulumunu tamamlamak için Activity kodunuzda Media3 Cast'i MediaRouteButtonFactory 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 Activity içinde Player.Listener oluşturun. 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.