1. Giriş
Son güncelleme: 2020-09-09
Video oynatma işlemine MediaSession eklemenin avantajları nelerdir?
Medya oturumları, Android platformu ile medya uygulamaları arasında ayrılmaz bir bağlantıdır. Bu, Android'e medya oynatıldığını bildirerek medya işlemlerinin doğru oturuma yönlendirilmesini sağlamanın yanı sıra platforma ne oynatıldığını ve nasıl kontrol edilebileceğini de bildirir.
Uygulamanız aracılığıyla bir MediaSession'ı kullanıma sunmanın, kullanıcıların yararlanabileceği çeşitli avantajları vardır. Aşağıda birkaç harika örnek verilmiştir.
Google Asistan
Kullanıcılar,"Duraklat", "Devam et" ve "Sonraki" gibi sesli komutlar aracılığıyla uygulamanızdaki medyayla kolayca etkileşime girebilir. Medyanızdaki meta veriler, şu anda oynatılan içeriklerle ilgili yanıtlar almak için de kullanılabilir.
Android TV
Büyük ekran deneyimlerinde, Android TV uygulamanız HDMI-CEC'yi destekleyen TV'lere sahip kullanıcılar için geleneksel uzaktan kumandaları kullanabilir. Oynat/duraklat, durdur, sonraki ve önceki düğmeleriyle verilen komutlar uygulamanıza iletilir.
Ekranda 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 kontrollerinin ve albüm kapaklarının 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ışsa bile bu senaryoların herhangi birinde medya kontrol edilebilir.
Ortam bilgi işlemi
Çalınan içerik ve nasıl kontrol edilebileceğiyle ilgili verilerle medyalarınızı kullanıma sunmak, cihazlar arasında köprü kurarak kullanıcıların medyalarınızla istedikleri şekilde etkileşime geçmelerini sağlayabilir.
Ne oluşturacaksınız?
Bu codelab'de, medya oturumu desteği eklemek için mevcut ExoPlayer örneğini genişleteceksiniz. Uygulamanız şunları yapabilecek:
- Medya oturumunun etkin durumunu doğru şekilde yansıtma
- Medya kontrollerini ExoPlayer'a aktarma
- Kuyruktaki öğ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 sırasındaki öğelerin meta verilerini medya oturumuna ekleme
- Ek (özel) işlemler ekleme
Bu codelab, MediaSession SDK'sına odaklanmaktadır. ExoPlayer uygulamasıyla ilgili ayrıntılar da dahil olmak üzere alakalı olmayan kavramlar ve kod blokları ele alınmaz ancak kopyalayıp yapıştırmanız için kullanımınıza sunulur.
Gerekenler
- Android Studio'nun yeni bir sürümü (3.5 veya sonraki sürümler)
- Android uygulamaları geliştirme konusunda temel bilgi
2. Hazırlanma
Başlangıç noktamız nedir?
Başlangıç noktamız, ExoPlayer'daki ana demo. Bu demoda, ekranda oynatma kontrolleri olan videolar yer alıyor ancak kutudan çıktığı haliyle medya oturumları kullanılmıyor. Bu, ekibimizin bu tür içerikleri inceleyip ekleyebileceği harika bir yerdir.
ExoPlayer örneğini edinme
Hızlı bir başlangıç 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çın
Android Studio'da demos/main altında bulunan 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.

En yeni Gradle sürümünü kullanmanız istenirse güncelleyin.
Uygulamanın nasıl tasarlandığıyla ilgili temel bilgileri edinmek için biraz zaman ayırın. SampleChooserActivity ve PlayerActivity olmak üzere iki etkinlik olduğunu unutmayın. Codelab'in geri kalanını, medyanın oynatıldığı PlayerActivity'de geçireceğiz. Bu nedenle, 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.
Aşağıdaki iki alanı sınıfın en üstünde tanımlayın. Bu alanları bu bölüm boyunca kullanacağız.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
"extension-mediasession" proje bağımlılığını "Module: demo" için modül düzeyindeki build.gradle dosyasına eklemeniz gerekir:
implementation project(path: ':extension-mediasession')
Android Studio'nun, MediaSessionConnector'ı çözmeyle ilgili hatanın üzerine fareyle geldiğinizde bu bağımlılığı otomatik olarak eklemenize yardımcı olabileceğini unutmayın:

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 ile ExoPlayer arasında aracı görevi gören bir medya oturumu ve medya oturumu bağlayıcısı oluşturmamız gerekir.
Bunu eklemek için ideal yer, ExoPlayer'ın oluşturulduğu yerdir. Demo uygulamamızda kodumuzu initializePlayer() öğesinin sonuna ekleyebiliriz. Bu mantığı oynatıcı başlatıldıktan 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 serbest bırakma
Artık ihtiyaç duyulmadığında medya oturumunu serbest bırakın. ExoPlayer'ı releasePlayer()'da yayınladığımızda bunu yapmak için aşağıdaki kodu da ekleyebiliriz:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
Medya oturumu durumunu yönetme
Medya oturumunu oluşturduğumuza göre, kullanıcının etkinlik ile 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ının etkinlikten ayrılmasıyla birlikte medya oturumunun devre dışı bırakıldığından emin olmak gerekir:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
Demoyu çalıştıralım
- Bir Android cihaz bağlayın veya emülatör başlatın.
- Android Studio araç çubuğundan çalıştırmak için "demo"nun seçili olduğundan emin olun.

- Android Studio araç çubuğundan
simgesini tıklayın. - Uygulama cihazınızda başlatıldıktan sonra oynatmak için bir video akışı seçin.
- Oynatma başladıktan sonra, medya oturumunu kontrol etmek için aşağıdaki
adbkomutları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
- 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 birleşimidir. Medya oturumunun çalıştırıldığını görmek için:
adb shell dumpsys media_session - Mikrofonlu fiziksel bir cihaz kullanıyorsanız Google Asistan'ı etkinleştirmeyi ve "Duraklat" gibi sesli komutlar vermeyi deneyin. "Devam ettir." "1 dakika ileri sar."
Android TV'de çalışan ExoPlayer örneği.
4. Oynatma sırasındaki öğelerin meta verileri dahil
Daha önce initializePlayer() içinde MediaSessionConnector'ı oluşturduğumuz medya oturumumuzun desteklenen özelliklerini artık genişletebiliriz.
TimelineQueueNavigator ekleme
ExoPlayer, medyanın yapısını zaman çizelgesi olarak gösterir. Bu özelliğin işleyiş şekliyle ilgili ayrıntılar için ExoPlayer'ın Timeline object (Zaman Çizelgesi nesnesi) hakkında bilgi edinin. Bu yapıdan yararlanarak içerik değiştiğinde bilgilendirilebiliriz ve istendiğinde şu anda oynatılan içeriğin meta verilerini gösterebiliriz.
Bunu yapmak için bir TimelineQueueNavigator tanımlayacağız. initializePlayer() içinde MediaSessionConnector'ın oluşturulduğu yeri bulun ve mediaSession başlatıldıktan sonra TimelineQueueNavigator'ın bir uygulamasını 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 çözün:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
windowIndex parametresinin, oynatma sırasındaki ilgili dizine sahip öğeyle eşleştiğini unutmayın.
Meta verileri eklediğinize göre Asistan'ın ne çalındığını anlayıp anlamadığını test edebilirsiniz. Android TV'de video oynatırken Asistan'ı etkinleştirip "Ne oynatılıyor?" diye sorun.

5. İşlemleri özelleştirme
Belki oynatıcınız bazı işlemleri desteklemiyor veya daha fazla işlem için destek eklemek istiyorsunuzdur. Şimdi de initializePlayer() içinde MediaSessionConnector'ımızı daha önce oluşturduğumuz medya oturumuna biraz daha yakından bakalım.
Desteklenen işlemleri bildirme
Medya oturumunun desteklemesini istediğiniz işlemleri özelleştirmek için mediaSessionConnector.setEnabledPlaybackActions() simgesini kullanmayı deneyin.
Tam kümenin şu 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 platformda nasıl gösterildiğine tekrar bakalım:
- Daha önce olduğu gibi bir video başlatın.
- Aşağıdaki komutu çalıştırarak Android'in medya oturumunuzdaki meta verileri nasıl gördüğünü inceleyin:
adb shell dumpsys media_session - Meta verileri içeren satırı bulun ve başlık ile açıklamanın
com.google.android.exoplayer2.demo/sampleile ilişkilendirilmiş olarak eklendiğini görün.
Ek işlemler ekleme
Medya oturumumuzu bazı ek işlemlerle genişletebiliriz. Bu bölümde yalnızca altyazı desteği eklenecektir.
Altyazı desteği
Medya oturumlarına altyazı desteği ekleyerek kullanıcıların altyazıları sesle açıp kapatmasına olanak tanır. Medya oturumu bağlayıcısını başlattığınız yere aşağıdakileri 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 düzeltin.
Bunu, Android TV'de Google Asistan'ı çağırıp "Altyazıları etkinleştir" diyerek test edebilirsiniz. Bu çağrıların kodunuza nasıl yapıldığını görmek için Logcat'te mesajları kontrol edin.
6. Tebrikler
Tebrikler, örneğe medya oturumlarını başarıyla eklediniz.
Aşağıdaki işlemleri yaparak çok sayıda işlev elde edebilirsiniz:
- Medya oturumu ekleme
- medya oturumlarını bir ExoPlayer örneğine bağlama,
- meta veri ve ek işlemler ekleme
Artık bir medya uygulamasını zenginleştirmek ve kullanıcılara daha kapsamlı bir deneyim sunmak için gereken temel adımları biliyorsunuz.
Son yorum
Bu codelab, ExoPlayer kaynak kodundaki bir örnek temel alınarak oluşturulmuştur. ExoPlayer'ı kaynaktan kullanmanıza gerek yoktur. Bunun yerine, en son sürümlerden haberdar olmanızı kolaylaştırmak için ExoPlayer ve MediaSessionConnector'ın bağımlılıklarını çekmeniz önerilir.
Bunu yapmak için aşağıdaki gibi proje bağımlılıklarını değiştirmeniz yeterlidir:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
gibi Maven depolarından çekmek için:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'