Media3 ExoPlayer kullanarak temel bir medya oynatıcı uygulaması oluşturma

Jetpack Media3, temel işlevselliği özetleyen bir Player arayüzünü tanımlar video ve ses dosyalarını oynatmak için kullanılır. ExoPlayer, varsayılan uygulamadır bu arayüzü Media3'te görebilirsiniz. ExoPlayer'ı kullanmanızı öneririz, çünkü bu uygulama çoğu oynatma durumunu kapsayan kapsamlı bir özellik grubudur. durumlar için özelleştirilebilir. ExoPlayer ayrıca cihaz ve işletim sistemi bölünmesini soyutlayarak kodunuzun tutarlı bir şekilde çalışmasını sağlar dönüşüm hunisinin her yerinde gerçekleşiyor. ExoPlayer şunları içerir:

Bu sayfa, bir oynatma listesi oluşturmanın bazı önemli adımlarında size yol gösterir daha fazla bilgi için bkz. Media3 ExoPlayer.

Başlarken

Başlamak için ExoPlayer, UI ve Genel modüllerine bağımlılık ekleyin. Jetpack Media3:

implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"

Kullanım alanınıza bağlı olarak Media3'ten ek modüllere de ihtiyaç duyabilirsiniz. Örneğin, akışları DASH biçiminde oynatmak için exoplayer-dash.

1.4.0 yerine kitaplığını açar. Sürüm notlarına en son sürümü görebilirsiniz.

Medya oynatıcı oluşturma

Media3 ile dahil edilen Player uygulamasını kullanabilirsiniz. arayüzünü, ExoPlayer veya kendi özel uygulamanızı oluşturabilirsiniz.

ExoPlayer Oluşturma

ExoPlayer örneği oluşturmanın en basit yolu şu şekildedir:

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

Medya oynatıcınızı şu öğenin onCreate() yaşam döngüsü yönteminde oluşturabilirsiniz: Bulunduğu yerde Activity, Fragment veya Service.

Builder şunları içerir: ilginizi çekebilecek bir dizi özelleştirme seçeneği mevcuttur. Örneğin:

Media3, uygulamanızın arayüzüne ekleyebileceğiniz bir PlayerView kullanıcı arayüzü bileşeni sağlar düzen dosyası olabilir. Bu bileşen, oynatma için bir PlayerControlView içerir kontrolleri, altyazıları görüntülemek için SubtitleView ve oluşturma için Surface videosunu izleyin.

Oynatıcıyı hazırlama

Şunun için oynatma listesine medya öğeleri ekleyin: çeşitli yöntemlerle setMediaItem() ve addMediaItem(). Ardından, prepare() numaralı telefonu arayarak medya yüklemeye ve gerekli kaynakları edinmeye başlayın.

Uygulama ön planda olmadan bu adımları uygulamamalısınız. Eğer Activity veya Fragment içindedir. Bu, oyuncuyu API düzeyi 24 ve üstü veya onResume() üzerinde onStart() yaşam döngüsü yöntemi yaşam döngüsü yöntemini uygulayın. Service içinde yer alan bir oyuncu için bunu onCreate() ile hazırlayabilirsiniz.

Oynatıcıyı kontrol etme

Oynatıcı hazırlandıktan sonra çağrı yöntemleriyle oynatmayı kontrol edebilirsiniz. örneğin:

PlayerView veya PlayerControlView gibi kullanıcı arayüzü bileşenleri güncellenir her zaman uygun olması gerekir.

Oynatıcıyı serbest bırakın

Oynatma için video gibi sınırlı kaynaklar gerekebilir. kod çözücüler olduğu için release() artık ihtiyacınız kalmadığında kaynakları serbest bırakmak için oynatıcınıza.

Oynatıcınız bir Activity veya Fragment içindeyse oynatıcıyı API düzeyi 24 ve üstü veya onPause() üzerinde onStop() yaşam döngüsü yöntemi yöntemini çağırın. Service içindeki bir oyuncu için şunları yapabilirsiniz: onDestroy() yılında yayınlayacağım.

Medya oturumuyla oynatmayı yönetme

Android'de medya oturumları, medyayla etkileşimde bulunmak için standart bir yol sunar. oyuncuları bu teste tabi tutmak isteyebilirsiniz. Oynatıcınıza medya oturumu bağlama medya oynattığınız medya içeriğinin tanıtımını harici olarak ve oynatma için reklam yapmanıza olanak tanır. harici kaynaklardan gelen komutlar (örneğin, Mobil cihazlarda ve büyük ölçekte sistem medya denetimleri cihazları ayırın.

Medya oturumlarını kullanmak için Media3 Oturumu modülüne bir bağımlılık ekleyin:

implementation "androidx.media3:media3-session:1.4.0"

Medya oturumu oluşturma

Oynatıcıyı başlattıktan sonra aşağıdaki şekilde MediaSession oluşturabilirsiniz:

Kotlin

val player = ExoPlayer.Builder(context).build()
val mediaSession = MediaSession.Builder(context, player).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();
MediaSession mediaSession = new MediaSession.Builder(context, player).build();

Media3, Player öğesinin durumunu MediaSession. Aşağıdakiler dahil tüm Player uygulamalarında çalışır: ExoPlayer, CastPlayer veya bir yardımcı olur.

Diğer istemcilere denetim izni ver

İstemci uygulamaları bir medya denetleyicisi uygulayabilir. medya oturumunuzun oynatılmasını kontrol etmek için. Bu istekleri almak için bir callback nesnesi MediaSession oluşturun.

Bir kumanda medya oturumunuza bağlanmak üzereyken onConnect() yöntemi çağrılır. Sağlanan ControllerInfo karar vermek için kabul etme veya reddet talep ediyor. Media3 Oturumu demo uygulamasında bunun bir örneğini görebilirsiniz.

Bağlandıktan sonra kumanda, oturuma oynatma komutları gönderebilir. İlgili içeriği oluşturmak için kullanılan ardından bu komutları oyuncuya aktarır. Oynatma ve oynatma listesi Player arayüzünde tanımlanan komutlar, Search Ads 360'ta otomatik olarak kabul edilir.

Diğer geri çağırma yöntemleri, örneğin özel oynatma komutları ve oynatma listesinde değişiklik yapmak. Bu geri çağırmalar benzer şekilde bir ControllerInfo nesnesi içerir. Böylece istek bazında belirleyebilirsiniz.

Arka planda medya oynatma

Örneğin, uygulamanız ön planda değilken medya oynatmaya devam etmek için Kullanıcı uygulamanızın yanında olmasa bile müzik, sesli kitap veya podcast çalmak için açık, Player ve MediaSession bir ön plan hizmeti sunar. Medya3 MediaSessionService arayüzünü kullanmanızı öneririz.

MediaSessionService uygulama

MediaSessionService uzantısını genişleten bir sınıf oluşturun ve onCreate() yaşam döngüsü yönteminde MediaSession.

Kotlin

class PlaybackService : MediaSessionService() {
    private var mediaSession: MediaSession? = null

    // Create your Player and MediaSession in the onCreate lifecycle event
    override fun onCreate() {
        super.onCreate()
        val player = ExoPlayer.Builder(this).build()
        mediaSession = MediaSession.Builder(this, player).build()
    }

    // Remember to release the player and media session in onDestroy
    override fun onDestroy() {
        mediaSession?.run {
            player.release()
            release()
            mediaSession = null
        }
        super.onDestroy()
    }
}

Java

public class PlaybackService extends MediaSessionService {
    private MediaSession mediaSession = null;

    @Override
    public void onCreate() {
        super.onCreate();
        ExoPlayer player = new ExoPlayer.Builder(this).build();
        mediaSession = new MediaSession.Builder(this, player).build();
    }

    @Override
    public void onDestroy() {
        mediaSession.getPlayer().release();
        mediaSession.release();
        mediaSession = null;
        super.onDestroy();
    }
}

Manifest'inizde, MediaSessionService amacı taşıyan Service sınıfınız filtrele ve ön plan çalıştırmak için FOREGROUND_SERVICE izni iste hizmet:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaSessionService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Son olarak, oluşturduğunuz sınıfta kontrol etmek için onGetSession() yöntemini geçersiz kılın. medya oturumunuza istemci erişimi. Şu şartları kabul etmek için MediaSession iade edin: bağlantı isteğini gönderin veya isteği reddetmek için null değerini döndürün.

Kotlin

// This example always accepts the connection request
override fun onGetSession(
    controllerInfo: MediaSession.ControllerInfo
): MediaSession? = mediaSession

Java

@Override
public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) {
  // This example always accepts the connection request
  return mediaSession;
}

Kullanıcı arayüzünüze bağlanılıyor

Medya oturumunuz artık Activity veyaService Oynatıcı kullanıcı arayüzünüzün bulunduğu Fragment ise bağlantı kurmak için MediaController kullanabilirsiniz en iyi uygulamaları paylaşacağız. Activity veya Fragment hesabının onStart() yönteminde Kullanıcı arayüzü, MediaSession için bir SessionToken oluşturun, ardından SessionToken kullanın MediaController oluşturmak için kullanın. Bir MediaController oluşturulur eşzamansız olarak ayarlayabilirsiniz.

Kotlin

override fun onStart() {
  val sessionToken = SessionToken(this, ComponentName(this, PlaybackService::class.java))
  val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync()
  controllerFuture.addListener(
    {
        // Call controllerFuture.get() to retrieve the MediaController.
        // MediaController implements the Player interface, so it can be
        // attached to the PlayerView UI component.
        playerView.setPlayer(controllerFuture.get())
      },
    MoreExecutors.directExecutor()
  )
}

Java

@Override
public void onStart() {
  SessionToken sessionToken =
    new SessionToken(this, new ComponentName(this, PlaybackService.class));
  ListenableFuture<MediaController> controllerFuture =
    new MediaController.Builder(this, sessionToken).buildAsync();
  controllerFuture.addListener(() -> {
    // Call controllerFuture.get() to retrieve the MediaController.
    // MediaController implements the Player interface, so it can be
    // attached to the PlayerView UI component.
    playerView.setPlayer(controllerFuture.get());
  }, MoreExecutors.directExecutor())
}

MediaController, Player arayüzünü uyguladığından aynı oynatmayı kontrol etmek için play() ve pause() gibi yöntemleri kullanın. Diğerlerine benzer aşağıdaki kod parçasını kaldırdıktan sonra MediaController öğesini yayınlamayı unutmayın: (ör. Activity için onStop() yaşam döngüsü yöntemi) MediaController.releaseFuture().

Bildirim yayınlama

Etkin durumdayken bildirim yayınlamak için ön plan hizmetleri gereklidir. CEVAP MediaSessionService, otomatik olarak bir Şunun için MediaStyle bildirim: MediaNotification biçiminde alırsınız. Özel bir bildirim sağlamak için MediaNotification.Provider DefaultMediaNotificationProvider.Builder ile veya sağlayıcı arayüzünün özel bir uygulamasını oluşturarak. MediaSession ile kullanmak üzere setMediaNotificationProvider

İçerik kitaplığınızı tanıtma

MediaLibraryService, istemcinin izin verdiği MediaSessionService üzerinde çalışır uygulamalar (uygulamanız tarafından sağlanan medya içeriğine göz atmak için) İstemci uygulamaları Etkileşimde bulunmak için MediaBrowser MediaLibraryService cihazınızla.

MediaLibraryService uygulamak, MediaSessionService, ancak onGetSession() içinde MediaSession yerine MediaLibrarySession. Şuna kıyasla: MediaSession.Callback, MediaLibrarySession.Callback ek bilgiler içerir tarayıcı istemcisinin web sitenizde sunulan içeriği gezinmesine olanak tanıyan yardımcı oluyorum.

MediaSessionService benzer şekilde, MediaLibraryService öğesini manifest dosyasını açın ve ön plan çalıştırmak için FOREGROUND_SERVICE iznini isteyin hizmet:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaLibraryService"/>
        <action android:name="android.media.browse.MediaBrowserService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Yukarıdaki örnekte hem MediaLibraryService için bir intent filtresi bulunmaktadır. ve geriye dönük uyumluluk için eski MediaBrowserService. İlgili içeriği oluşturmak için kullanılan ek amaç filtresi, MediaBrowserCompat API'yi kullanan istemci uygulamalarını etkinleştirir Service cihazınızı tanımak için.

MediaLibrarySession, içerik kitaplığınızı ağaçta sunmanızı sağlar yapısında, tek bir kök MediaItem bulunur. Ağaçtaki her MediaItem bitkisinde için istediğiniz sayıda alt MediaItem düğümü oluşturabilirsiniz. Farklı bir kök veya farklı bir ağaç ekleyebilirsiniz. Örneğin, ziyaret ettiğiniz ağaç önerilen medya öğelerinin listesini arayan bir müşteriye yalnızca kök MediaItem ve tek düzeyde alt MediaItem düğümünü içermelidir. Bu durumda farklı bir istemci uygulamasına döndüğünüz ağaç, tamamını da kullanabilirsiniz.

MediaLibrarySession oluşturuluyor

MediaLibrarySession MediaSession API'yi genişleterek içerik tarama API'leri ekler. Şuna kıyasla: MediaSession geri arama, MediaLibrarySession geri arama aşağıdaki gibi yöntemler ekler:

  • onGetLibraryRoot() (müşteri içerik ağacının kök MediaItem'sini istediğinde kullanılır)
  • onGetChildren() istemci, içerik ağacındaki bir MediaItem öğesinin alt öğelerini istediğinde
  • onGetSearchResult() belirli bir sorgu için içerik ağacından arama sonuçları istediğinde sorgu

İlgili geri çağırma yöntemleri bir LibraryParams içerir istemci uygulamasının topladığı içerik ağacı türüyle ilgili ek sinyaller içeren nesne yardımcı olur.