1. Giriş
Son Güncelleme Tarihi: 09.09.2020
Video oynatma işlemine bir MediaSession eklemenin avantajları nelerdir?
Medya oturumları, Android platformu ile medya uygulamaları arasındaki ayrılmaz bir bağlantıdır. Android'e medyanın oynatıldığı konusunda bilgi vermekle kalmaz, böylece medya işlemlerini doğru oturuma yönlendirebilir. Ayrıca, aynı zamanda platforma oynatılan içerik ve bunların nasıl kontrol edilebileceği hakkında bilgi verir.
Uygulamanız üzerinden bir MediaSession görüntülemek kullanıcıların keyif alacağı çeşitli avantajlar sağlar. İşte birkaç mükemmel örnek.
Google Asistan
Kullanıcılar "Duraklat", "Devam ettir", ve "Sonraki"yi seçin. Medyanızdaki meta veriler, oynatılan video hakkında yanıt almak için de kullanılabilir.
Android TV
Android TV uygulamanız, büyük ekran deneyimlerinde HDMI-CEC'yi destekleyen TV'lerin kullanıcıları için geleneksel uzaktan kumandalardan yararlanabilir. Oynat/duraklat, durdur, sonraki ve önceki düğmeleriyle verilen komutlar uygulamanıza aktarılır.
Ekrandaki medya kontrolleri
Sistem, Android 4.0 (API düzeyi 14) sürümünden itibaren 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 bağlı olarak değişiklik gösterir.
Arka plan medyası
Medyayı oynatan uygulama arka planda çalışıyor olsa bile medya, bu senaryolardan herhangi birinde kontrol edilebilir.
Ambiyans işlemi
Oynatılan medya ve bunun nasıl kontrol edilebileceği ile ilgili verilerle medyanıza erişmek, cihazlar arasında köprü oluşturarak kullanıcıların hoşlarına giden çeşitli şekillerde etkileşimde bulunabilmesini sağlayabilir.
Oluşturacaklarınız
Bu codelab'de, medya oturumu desteğini eklemek için mevcut Exoplayer örneğini genişleteceksiniz. Uygulamanız şunları yapabilecek:
- Medya oturumunun etkin durumunu doğru şekilde yansıt
- Medya kontrollerini ExoPlayer'a aktarma
- Sıradaki öğelerin meta verilerini medya oturumuna iletme
Neler öğreneceksiniz?
- Medya oturumları neden kullanıcılara daha zengin bir deneyim sunar?
- Medya oturumu oluşturma ve durumunu yönetme
- Bir medya oturumunu ExoPlayer'a bağlama
- Medya oturumunda oynatma sırasındaki öğelerin meta verileri nasıl eklenir?
- Ek (özel) işlemler ekleme
Bu codelab, MediaSession SDK'sına odaklanmaktadır. ExoPlayer uygulamasıyla ilgili ayrıntılar da dahil olmak üzere, alakasız kavramlar ve kod blokları ele alınmamıştır, ancak bunları kopyalayıp yapıştırmanız için sağlanmıştır.
Gerekenler
- Android Studio'nun yeni bir sürümü (3.5 veya üzeri)
- Android uygulamaları geliştirmeyle ilgili temel bilgiler
2. Kurulum
Başlangıç noktamız nedir?
Başlangıç noktamız, ExoPlayer'ın ana demosu. Bu demo, ekranda oynatma kontrolleri bulunan videolar içerir ancak kullanıma hazır medya oturumlarını kullanmaz. Burası bizim için derinlere dalıp bunları eklemek için harika bir yer.
ExoPlayer örneğini alma
İlk olarak 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ç
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 önerilerini uygulayabilirsiniz.
En son Gradle sürümünü kullanmanız istenirse gidip güncelleyin.
Uygulamanın nasıl tasarlandığını temel olarak anlamak için bir dakikanızı ayırın. İki etkinlik olduğunu unutmayın: SampleChooserActivity ve PlayerActivity. Codelab'in geri kalanını medyanın gerçekten oynatıldığı PlayerActivity'de geçireceğiz. Bu nedenle bu sınıfı açın ve bir 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 ekranda video 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. Bölüm boyunca bu alanları kullanacağız.
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
"extension-mediasession" parametresini eklemeniz gerekir "Modül: demo" için modül düzeyindeki build.gradle
bölümüne proje bağımlılığı:
implementation project(path: ':extension-mediasession')
MediaSessionConnector sorununu çözerken fareyle hatanın üzerine gelirseniz Android Studio'nun bu bağımlılığı otomatik olarak eklemenize yardımcı olabileceğini unutmayın:
Son olarak, aşağıdakini 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şturulduktan sonra, bir medya oturumu ve medya oturumu ile ExoPlayer arasında aracı işlevi 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ı örneklendirildikten 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 yayınlama
Artık gerekli olmadığında medya oturumunu bırakın. releasePlayer()
üzerinde ExoPlayer'ı kullanıma sunduğumuzda bunun için aşağıdaki kodu da ekleyebiliriz:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
Medya oturumu durumunu yönetme
Artık medya oturumunu örneklendirdiğimize göre, kullanıcı etkinlikle etkileşim kurarken oturum durumunun doğru bir şekilde yansıtıldığından emin olmamız gerekiyor.
Kullanıcı etkinliği başlattığında medya oturumu etkin hale gelir:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
Uygulamamız arka planda medya oynatmadığından, kullanıcı etkinlikten ayrılırken medya oturumunun devre dışı kalmasını sağlamak çok önemlidir:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
Şimdi demoyu yapalım
- Android cihaz ekleyin veya bir emülatör başlatın.
- "Demo"nun doğru şekilde Android Studio araç çubuğundan çalıştırılmak üzere seçilidir. .
- Android Studio araç çubuğunda 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
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
- Ayrıca Android'in medya oturumunuzu nasıl gördüğünü de keşfedin. Özellikle, işlem alanına bakarak hangi işlemlerin desteklendiğini kontrol edebilirsiniz. Burada gördüğünüz sayı, PlaybackState nesnesinde belirtilen işlem kimliklerinin bir kombinasyonudur. Medya oturumunun çalıştırılmasını görmek için:
adb shell dumpsys media_session
- Mikrofonu olan fiziksel bir cihaz kullanıyorsanız Google Asistan'ı çağırmayı 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 verilerini ekleme
Daha önce MediaSessionConnector'umuzu initializePlayer()
içinde oluşturduğumuz medya oturumumuzun desteklenen özelliklerini artık genişletebiliriz.
ScheduleQueueNavigator Ekleme
ExoPlayer, medya yapısını bir zaman çizelgesi olarak temsil eder. Bunun işleyiş şekli hakkında ayrıntılı bilgi için ExoPlayer'ın Zaman Çizelgesi nesnesi hakkındaki makaleyi okuyun. Bu yapıdan yararlanarak içerik değiştiğinde bilgilendirilebilir ve sorulduğunda o anda oynatılan içeriğin meta verilerini gösterebiliriz.
Bunun için bir ScheduleQueueNavigator tanımlayacağız. initializePlayer()
içinde MediaSessionConnector örneğini bulun ve mediaSession
başlatıldıktan sonra bir ScheduleQueueNavigator 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();
}
});
Sınıf içe aktarma işlemlerini çözmek için şunları ekleyin:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
windowIndex
parametresinin, oynatma sırasında bulunan dizinin öğesine karşılık geldiğini unutmayın.
Birkaç 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ıp "Ne oynuyor?" diye sorun
5. İşlemleri özelleştirme
Oynatıcınız bazı işlemleri desteklemiyor veya daha fazlası için destek eklemek istiyor olabilirsiniz. Şimdi, daha önce initializePlayer()
ayında MediaSessionConnector'ı 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()
kullanmayı deneyin.
Setin tamamı aşağıdaki gibi olmalıdır:
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 aktarıldığını tekrar inceleyelim:
- Daha önce yaptığınız gibi bir video başlatın.
- Android'in medya oturumunuzdaki meta verileri nasıl gördüğünü öğrenmek için şu komutu çalıştırın:
adb shell dumpsys media_session
- Meta veriyi içeren satırı bulun ve başlık ile açıklamanın dahil edilip
com.google.android.exoplayer2.demo/sample
ile ilişkilendirildiğinden emin olun.
Başka işlemler ekleme
Medya oturumumuzun kapsamını birkaç ek işlemle genişletebiliriz. Bu bölümde yalnızca altyazı desteği ekleyeceğiz.
Altyazıları destekleme
Medya oturumlarına altyazı desteği eklemek, kullanıcıların bunları seslerini kullanarak açıp kapatmalarına olanak tanır. Medya oturumu bağlayıcısını başlattığınızda 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 giderin.
Android TV'de Google Asistan'ı çağırıp "Altyazıları etkinleştir" diyerek bunu test edebilirsiniz. Bunun kodunuza nasıl çağrı yaptığını görmek için Logcat'i kontrol edin.
6. Tebrikler
Tebrikler, medya oturumlarını başarıyla örneğe eklediniz.
Aşağıdakileri yaparak çok sayıda işlevsellik elde ettiniz:
- bir medya oturumu eklediğinizde,
- medya oturumlarını ExoPlayer'ın bir örneğine bağlamaya
- meta veri ve ek işlemler ekleyebilirsiniz.
Bir medya uygulamasını zenginleştirmek ve kullanıcılara daha çok yönlü bir deneyim sunmak için atılması gereken temel adımları artık biliyorsunuz.
Son not
Bu codelab, ExoPlayer kaynak kodundaki bir örnek üzerine oluşturulmuştur. ExoPlayer'ı kaynaktan kullanmanız gerekmez ve en son sürümleri takip etmek daha kolay olması için onun yerine ExoPlayer ve MediaSessionConnector bağımlılıklarını almanız önerilir.
Bu amaçla proje bağımlılıklarını şu kriterler ile değiştirmeniz yeterlidir:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
şunun gibi Maven depolarından almak için:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'