MediaSession aracılığıyla medyayı kontrol etme

1. Giriş

Son Güncelleme: 09.09.2020

Video oynatma sırasında MediaSession eklemenin avantajları nelerdir?

Medya oturumları, Android platformu ile medya uygulamaları arasında önemli bir bağlantıdır. Bu API, Android'i medya oynatıldığı konusunda bilgilendirerek medya işlemlerini doğru oturuma yönlendirir. Ayrıca platforma nelerin oynatıldığını ve nasıl kontrol edilebileceğini bildirir.

Uygulamanız aracılığıyla bir MediaSession göstermenin kullanıcılara sunacağı çeşitli avantajlar vardır. Aşağıda birkaç mükemmel örnek verilmiştir.

Google Asistan

Kullanıcılar "Duraklat", "Devam et" ve "Sonraki" gibi sesli komutlar aracılığıyla uygulamanızdaki medyayla kolayca etkileşim kurabilir. Medyanızdaki meta veriler, şu anda oynatılan içerikle ilgili yanıtlar almak için de kullanılabilir.

Android TV

Android TV uygulamanız, büyük ekran deneyimlerinde HDMI-CEC'yi destekleyen TV'leri olan kullanıcılar için geleneksel uzaktan kumandaları kullanabilir. Oynat/duraklat, durdur, sonraki ve önceki düğmeleriyle verilen komutlar uygulamanıza iletilir.

Ekrandaki medya kontrolleri

Android 4.0 (API düzeyi 14) sürümünden itibaren sistem, medya oturumunun oynatma durumuna ve meta verilerine erişebilir. Bu işlev, kilit ekranında medya denetimlerinin ve posterlerin gösterilmesini sağlar. Bu davranış, Android sürümüne göre değişir.

Arka plan medyası

Medyayı oynatan uygulama arka planda çalışıyor olsa bile medya bu senaryoların herhangi birinde kontrol edilebilir.

Ortam bilgisayarcılığı

Medyanızı, oynatılan içerik ve bu içeriğin nasıl kontrol edilebileceğiyle ilgili verilerle sunmak, cihazlar arasında köprü oluşturarak kullanıcıların içerikle istedikleri şekilde etkileşime geçmelerini sağlayabilir.

Oluşturacağınız uygulama

Bu codelab'de, mevcut Exoplayer örneğini genişleterek medya oturumu desteğini ekleyeceksiniz. Uygulamanız şunları yapabilecek:

  • Medya oturumunun etkin durumunu doğru şekilde yansıtmalıdır.
  • Medya denetimlerini ExoPlayer'a aktarma
  • Sırada bulunan öğelerin meta verilerini medya oturumuna aktarma

Neler öğreneceksiniz?

  • Medya oturumları kullanıcılara neden daha zengin bir deneyim sunar?
  • Medya oturumu oluşturma ve durumunu yönetme
  • Medya oturumunu ExoPlayer'a bağlama
  • Oynatma kuyruğundaki öğelerin meta verilerini medya oturumuna ekleme
  • Ek (özel) işlemler ekleme

Bu codelab, MediaSession SDK'sına odaklanır. ExoPlayer uygulamasıyla ilgili ayrıntılar da dahil olmak üzere alakalı olmayan kavramlar ve kod blokları ele alınmaz ancak yalnızca kopyalayıp yapıştırmanız için sunulur.

Gerekenler

  • Android Studio'nun son sürümü (3.5 veya sonraki sürümler)
  • Android uygulamaları geliştirmeyle ilgili temel bilgiler

2. Hazırlanma

Başlangıç noktamız nedir?

Başlangıç noktamız, ExoPlayer'ın ana demosudur. Bu demoda, ekranda oynatma kontrolleri bulunan videolar yer alır ancak medya oturumları hazır olarak kullanılmaz. Bu, bu tür içerikleri eklemek için harika bir yer.

ExoPlayer örneğini edinme

Başlamak için ExoPlayer örneğiyle başlayalım. Aşağıdaki kodu çalıştırarak GitHub deposunu klonlayın.

git clone https://github.com/google/ExoPlayer.git

Demoyu açma

Android Studio'da demos/main altındaki ana demo projesini açın.

Android Studio, SDK yolunu ayarlamanızı ister. Herhangi bir sorunla karşılaşırsanız IDE ve SDK araçlarını güncelleme ile ilgili önerileri uygulayabilirsiniz.

10e3b5c652186d57.png

En son Gradle sürümünü kullanmanız istenirse güncelleyin.

Uygulamanın nasıl tasarlandığını anlamak için biraz zaman ayırın. İki etkinlik olduğunu unutmayın: SampleChooserActivity ve PlayerActivity. Kodlab'ın geri kalanını, medyanın gerçekten oynatıldığı PlayerActivity sınıfında geçireceğiz. Bu sınıfı açıp sonraki bölüme geçin.

3. Medya oturumu oluşturma ve durumunu yönetme

Medya oturumunu oluşturma

PlayerActivity.java adlı kişiyi aç. Bu sınıf, ExoPlayer'ı oluşturur ve videoyu ekrana oluşturma gibi işlevlerini yönetir. Bu etkinlikte, ExoPlayer'ı bir medya oturumuna bağlayacağız.

Sınıfın en üstünde aşağıdaki iki alanı tanımlayın. Bu alanları bu bölüm boyunca kullanacağız.

private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;

"Modül: demo" için "extension-mediasession" proje bağımlılığını modül düzeyindeki build.gradle dosyasına eklemeniz gerekir:

implementation project(path: ':extension-mediasession')

Fareyle MediaSessionConnector'ı çözme hatasının üzerine gelirseniz Android Studio'nun bu bağımlılığı otomatik olarak eklemenize yardımcı olabileceğini unutmayın:

60055e4ad54fbb97.png

Son olarak, aşağıdakileri ekleyerek sınıf içe aktarma işlemlerini çözün:

import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;

Etkinlik oluşturulduğunda, medya oturumu ve medya oturumu ile ExoPlayer arasında aracı görevi gören bir medya oturumu bağlayıcısı oluşturmak isteriz.

Bunu eklemek için ideal yer, ExoPlayer'ın da oluşturulduğu yerdir. Demo uygulamamızda, kodumuzu initializePlayer() öğesinin sonuna ekleyebiliriz. Bu mantığı, oynatıcı oluşturulduktan sonra eklediğinizden emin olun.

private void initializePlayer() {
  if (player == null) {
    ...
    player = ...
    ...
    mediaSession = new MediaSessionCompat(this, "sample");
    mediaSessionConnector = new MediaSessionConnector(mediaSession);
    mediaSessionConnector.setPlayer(player);
  }
  ...
}

Medya oturumunu bırakma

Artık ihtiyaç duyulmadığında medya oturumunu serbest bırakın. ExoPlayer'ı releasePlayer()'te kullanıma sunduğumuzda bunu yapmak için aşağıdaki kodu da dahil edebiliriz:

private void releasePlayer() {
  if (mediaSession != null) {
    mediaSession.release();
  }
  ...
}

Medya oturumu durumunu yönetme

Medya oturumunu örneklendirdiğimize göre, kullanıcı etkinlikle etkileşim kurarken durumunun doğru şekilde yansıtıldığından emin olmamız gerekir.

Kullanıcı etkinliği başlattığında medya oturumu etkin hale gelmelidir:

@Override
public void onStart() {
  ...
  if (mediaSession != null) {
    mediaSession.setActive(true);
  }
}

Uygulamamız arka planda medya oynatmadığı için kullanıcı etkinlikten ayrıldığında medya oturumunun devre dışı bırakılması gerekir:

@Override
public void onStop() {
  super.onStop();
  if (mediaSession != null) {
    mediaSession.setActive(false);
  }
  ...
}

Demoyu çalıştıralım

  1. Bir Android cihaz bağlayın veya bir emülatör başlatın.
  2. Android Studio araç çubuğundan "demo"nun çalıştırılmak üzere seçili olduğundan emin olun. cb1ec4e50886874f.png
  3. Android Studio araç çubuğundan 9d8fb3a9ddf12827.png simgesini tıklayın.
  4. Uygulama cihazınızda açıldığında oynatılacak bir video akışı seçin.
  5. Oynatma başladıktan sonra medya oturumunu kontrol etmek için aşağıdaki adb komutlarını kullanarak keşfedin:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
  1. Ayrıca Android'in medya oturumunuzu nasıl gördüğünü de inceleyin. Özellikle işlem alanına bakarak hangi işlemlerin desteklendiğini kontrol edebilirsiniz. Burada gördüğünüz sayı, PlaybackState nesnesinde belirtildiği gibi işlem kimliklerinin bir kombinasyonudur. Medya oturumunun çalıştığını görmek için: adb shell dumpsys media_session
  2. Mikrofonu olan fiziksel bir cihaz kullanıyorsanız Google Asistan'ı çağırıp "Duraklat" gibi sesli komutlar vermeyi deneyin. "Devam ettir." "1 dakika ileri sar."

b8dda02a6fb0f6a4.pngAndroid TV'de çalışan ExoPlayer örneği.

4. Oynatma kuyruğundaki öğelerin meta verilerini ekleme

Artık initializePlayer()'te MediaSessionConnector'ımızı oluşturduğumuz medya oturumumuzun desteklenen özelliklerini genişletebiliriz.

TimelineQueueNavigator ekleme

ExoPlayer, medyanın yapısını zaman çizelgesi olarak gösterir. Bunun nasıl çalıştığıyla ilgili ayrıntılı bilgi için ExoPlayer'ın zaman çizelgesi nesnesi hakkındaki makaleyi okuyun. Bu yapıya erişerek içerik değiştiğinde bilgilendirilebilir ve istendiğinde oynatılan içeriğin meta verilerini gösterebiliriz.

Bunu yapmak için bir TimelineQueueNavigator tanımlayacağız. initializePlayer() içinde MediaSessionConnector'ın örneğini bulun ve mediaSession başlatıldıktan sonra TimelineQueueNavigator uygulaması ekleyin.

mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
  @Override
  public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
    return new MediaDescriptionCompat.Builder()
            .setTitle(player.getCurrentMediaItem().mediaMetadata.title)
            .setDescription("MediaDescription description for " + windowIndex)
            .setSubtitle("MediaDescription subtitle")
            .build();
  }
});

Aşağıdakileri ekleyerek sınıf içe aktarma işlemlerini çözebilirsiniz:

import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;

windowIndex parametresinin, oynatma kuyruğundaki ilgili dizinin öğesine karşılık geldiğini gözlemleyin.

Meta veri eklediğinize göre Asistan'ın oynatılan içeriği anlayıp anlamadığını test edebilirsiniz. Android TV'de video oynatırken Asistan'ı çağırın ve "Ne oynuyor?" diye sorun.

6c7fc0cb853cbc38.png

5. İşlemleri özelleştirme

Oynatıcınız bazı işlemleri desteklemiyor olabilir veya daha fazla işlem için destek eklemek istiyorsunuzdur. Şimdi, initializePlayer() konumunda MediaSessionConnector'ımızı daha önce oluşturduğumuz medya oturumuna biraz daha ayrıntılı bir şekilde göz atalım.

Desteklenen işlemleri belirtme

Medya oturumunun desteklemesini istediğiniz işlemleri özelleştirmek için mediaSessionConnector.setEnabledPlaybackActions() öğesini kullanmayı deneyin.

Tam setin şu şekilde olduğunu unutmayın:

mediaSessionConnector.setEnabledPlaybackActions(
        PlaybackStateCompat.ACTION_PLAY_PAUSE
                | PlaybackStateCompat.ACTION_PLAY
                | PlaybackStateCompat.ACTION_PAUSE
                | PlaybackStateCompat.ACTION_SEEK_TO
                | PlaybackStateCompat.ACTION_FAST_FORWARD
                | PlaybackStateCompat.ACTION_REWIND
                | PlaybackStateCompat.ACTION_STOP
                | PlaybackStateCompat.ACTION_SET_REPEAT_MODE
                | PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);

Bu verilerin platforma nasıl yayınlandığını tekrar görelim:

  1. Önceki gibi bir video başlatın.
  2. Aşağıdaki komutu uygulayarak Android'in medya oturumunuzdaki meta verileri nasıl gördüğünü keşfedin: adb shell dumpsys media_session
  3. Meta verileri içeren satırı bulun ve başlığın ve açıklamanın eklenip com.google.android.exoplayer2.demo/sample ile ilişkilendirildiğinden emin olun.

Ek işlemler ekleme

Medya oturumumuzu bazı ek işlemlerle genişletebiliriz. Bu bölümde yalnızca altyazı desteği eklenecektir.

Destekleyici altyazılar

Medya oturumlarına altyazı desteği eklemek, kullanıcıların altyazıları sesle etkinleştirmesine olanak tanır. Medya oturumu bağlayıcısını başlattığınız yere şunları ekleyin:

mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
      @Override
      public void onSetCaptioningEnabled(Player player, boolean enabled) {
        Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
      }

      @Override
      public boolean hasCaptions(Player player) {
        return true;
      }

      @Override
      public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
        return false;
      }
    }
);

Son olarak, eksik içe aktarma işlemlerini çözün.

Bunu test etmek için Android TV'de Google Asistan'ı çağırıp "Altyazıları etkinleştir" demeniz yeterlidir. Bu işlevin kodunuzu nasıl çağırdığını görmek için Logcat'te mesajları kontrol edin.

6. Tebrikler

Tebrikler, medya oturumlarını örneke başarıyla eklediniz.

Aşağıdakileri yaparak çok sayıda işlev elde ettiniz:

  • Medya oturumu ekleme,
  • Medya oturumlarını ExoPlayer örneğine bağlama,
  • meta veri ve ek işlemler ekleyebilirsiniz.

Artık bir medya uygulamasını zenginleştirmek ve kullanıcılara daha çok yönlü bir deneyim sunmak için gereken temel adımları biliyorsunuz.

Son not

Bu kod laboratuvarı, ExoPlayer kaynak kodundaki bir örnek üzerine inşa edilmiştir. ExoPlayer'ı kaynaktan kullanmanız gerekmez. Bunun yerine, en son sürümlerle güncel kalabilmek için ExoPlayer ve MediaSessionConnector için bağımlılıkları almanız önerilir.

Bunun için proje bağımlılıkları aşağıdaki gibi değiştirilmelidir:

implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')

Maven depolarından veri almak için:

implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'

Referans dokümanları