Oynatma etkinliklerini dinleme
Durum değişiklikleri ve oynatma hataları gibi etkinlikler, kayıtlı
Player.Listener
örnek. Bir dinleyiciyi bu tür sunumlara
etkinlikler:
Kotlin
// Add a listener to receive events from the player. player.addListener(listener)
Java
// Add a listener to receive events from the player. player.addListener(listener);
Player.Listener
, boş varsayılan yöntemlere sahip. Bu nedenle, tek yapmanız gereken
kolayca uygulayabilirsiniz. İlgili eksiksiz açıklama için bkz. Javadoc
ve ne zaman çağrıldıklarını öğrenebilirsiniz. En önemli yöntemlerden bazıları
aşağıda daha ayrıntılı olarak açıklanmıştır.
Dinleyiciler tek tek etkinlik geri çağırması uygulama veya bir
bir veya daha fazla etkinlik gerçekleştikten sonra çağrılan genel onEvents
geri çağırması
birlikte. İlgili açıklama için bkz. Individual callbacks vs onEvents
farklı kullanım alanlarında tercih edilmelidir.
Oynatma durumu değişiklikleri
Oynatıcı durumundaki değişiklikler,
Kayıtlı bir hesaptaki onPlaybackStateChanged(@State int state)
Player.Listener
. Oynatıcı, dört oynatma durumundan birinde olabilir:
Player.STATE_IDLE
: Bu, oynatıcının ilk durumudur. ve oynatma başarısız olduğunda görebilirsiniz. Oynatıcının kaynakları yalnızca sınırlı olacaktır bu durumda.Player.STATE_BUFFERING
: Oyuncu, ekranından hemen oynayamaz geçerli konum olarak kabul edilir. Bunun nedeni genellikle daha fazla veri yüklenmesi gerekmesidir.Player.STATE_READY
: Oyuncu, mevcut konumundan hemen oynayabilir dokunun.Player.STATE_ENDED
: Oynatıcı tüm medyayı oynatmayı bitirdi.
Bu durumlara ek olarak, oynatıcının playWhenReady
işareti bulunur.
daha iyi anlamanızı sağlar. Bu işaretteki değişiklikler,
onPlayWhenReadyChanged(playWhenReady, @PlayWhenReadyChangeReason int reason)
Oyuncu oyun oynarken (yani konumu değişiyor, medya da kullanıcıya sunulanlara) aşağıdaki koşulların üçü de karşılandığında:
- Oyuncu
Player.STATE_READY
durumunda playWhenReady
true
- Şu kullanıcı tarafından bildirilen bir nedenden dolayı oynatma engellenmemiştir:
Player.getPlaybackSuppressionReason
.
Bu özellikleri tek tek kontrol etmek yerine Player.isPlaying
çağrılabilir. Bu durumda yapılan değişiklikler,
onIsPlayingChanged(boolean isPlaying)
:
Kotlin
player.addListener( object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { if (isPlaying) { // Active playback. } else { // Not playing because playback is paused, ended, suppressed, or the player // is buffering, stopped or failed. Check player.playWhenReady, // player.playbackState, player.playbackSuppressionReason and // player.playerError for details. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onIsPlayingChanged(boolean isPlaying) { if (isPlaying) { // Active playback. } else { // Not playing because playback is paused, ended, suppressed, or the player // is buffering, stopped or failed. Check player.getPlayWhenReady, // player.getPlaybackState, player.getPlaybackSuppressionReason and // player.getPlaybackError for details. } } });
Oynatma hataları
Oynatmanın başarısız olmasına neden olan hatalar,
Kayıtlı bir hesaptaki onPlayerError(PlaybackException error)
Player.Listener
. Bir hata oluştuğunda bu yöntem çağrılır
oynatma durumu Player.STATE_IDLE
olarak değişmeden hemen önce.
Başarısız olan veya durdurulan oynatmalar, ExoPlayer.prepare
aranarak yeniden denenebilir.
Bazı Player
uygulamalarının,
PlaybackException
hatasıyla ilgili ek bilgi sağlar. Örneğin,
örneğin, type
olan ExoPlaybackException
ExoPlayer
kartı,
rendererIndex
ve ExoPlayer'a özel diğer alanlar.
Aşağıdaki örnekte, bir HTTP ağ iletişimi sorunu:
Kotlin
player.addListener( object : Player.Listener { override fun onPlayerError(error: PlaybackException) { val cause = error.cause if (cause is HttpDataSourceException) { // An HTTP error occurred. val httpError = cause // It's possible to find out more about the error both by casting and by querying // the cause. if (httpError is InvalidResponseCodeException) { // Cast to InvalidResponseCodeException and retrieve the response code, message // and headers. } else { // Try calling httpError.getCause() to retrieve the underlying cause, although // note that it may be null. } } } } )
Java
player.addListener( new Player.Listener() { @Override public void onPlayerError(PlaybackException error) { @Nullable Throwable cause = error.getCause(); if (cause instanceof HttpDataSourceException) { // An HTTP error occurred. HttpDataSourceException httpError = (HttpDataSourceException) cause; // It's possible to find out more about the error both by casting and by querying // the cause. if (httpError instanceof HttpDataSource.InvalidResponseCodeException) { // Cast to InvalidResponseCodeException and retrieve the response code, message // and headers. } else { // Try calling httpError.getCause() to retrieve the underlying cause, although // note that it may be null. } } } });
Oynatma listesi geçişleri
Oynatıcı, oynatma listesinde yeni bir medya öğesine geçiş yaptığında
onMediaItemTransition(MediaItem mediaItem,
@MediaItemTransitionReason int reason)
kayıtlı olarak çağrıldı
Player.Listener
nesne. Neden, bunun otomatik bir dönüşüm
bir arama (örneğin, player.next()
çağırdıktan sonra), tekrar
veya bir oynatma listesindeki değişikliğin neden olduğu (örneğin,
oynatma öğesi kaldırılır).
Meta veri
player.getCurrentMediaMetadata()
alanından döndürülen meta veriler birçok nedenden dolayı değişebilir
nedenler: oynatma listesi geçişleri, yayın içi meta veri güncellemeleri veya
oynatma sırasında mevcut MediaItem
.
Meta veri değişiklikleriyle ilgileniyorsanız, örneğin gösterilen bir kullanıcı arayüzünü güncellemek için
şu anda onMediaMetadataChanged
şarkısını dinleyebilirsiniz.
Oynatma konumu değiştiriliyor
Player.seekTo
yöntemlerinin çağrılması, kayıtlı numaraya bir dizi geri çağırmayla sonuçlanır
Player.Listener
örnek:
reason=DISCONTINUITY_REASON_SEEK
ileonPositionDiscontinuity
. BuPlayer.seekTo
çağrısının doğrudan sonucu. Geri aramadaPositionInfo
var alanlarını genişletmeyi seçin.- Aramayla ilgili herhangi bir ani durum değişikliği olan
onPlaybackStateChanged
. Böyle bir değişiklik olmayabileceğini unutmayın.
Ayrı geri arama sayısı ile onEvents
karşılaştırması
Dinleyiciler,
onIsPlayingChanged(boolean isPlaying)
ve genel
onEvents(Player player, Events events)
geri arama. Genel geri çağırma,
Player
nesnesine erişim sağlar ve gerçekleşen events
kümesini belirtir
birlikte. Bu geri çağırma, her zaman
ayrı ayrı değerlendirebilirsiniz.
Kotlin
override fun onEvents(player: Player, events: Player.Events) { if ( events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED) ) { uiModule.updateUi(player) } }
Java
@Override public void onEvents(Player player, Events events) { if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) { uiModule.updateUi(player); } }
Aşağıdaki durumlarda bağımsız etkinlikler tercih edilmelidir:
- Dinleyici değişikliklerin nedenleriyle ilgileniyordur. Örneğin,
onPlayWhenReadyChanged
veyaonMediaItemTransition
için belirtilen nedenler. - İşleyici yalnızca geri çağırma parametreleri aracılığıyla sağlanan yeni değerler üzerinde işlem yapar veya geri çağırma parametrelerine bağlı olmayan başka bir şeyi tetikler.
- Dinleyici uygulaması, izleyicinin uygulamada neyin yöntem adındaki etkinliği tetikler.
- Dinleyici, her bir konu hakkında bilgi sahibi olması gereken bir analiz ve durum değişiklikleri olabilir.
Genel onEvents(Player player, Events events)
,
şu durumlardan biridir:
- İşleyici, birden fazla etkinlik için aynı mantığı tetiklemek ister. Örneğin,
Örneğin, hem
onPlaybackStateChanged
hem deonPlayWhenReadyChanged
. - İşleyicinin daha fazla etkinlik tetiklemek için
Player
nesnesine erişmesi gerekir. örnek olarak verilebilir. - Dinleyici, raporlanan birden çok durum değeri kullanmayı amaçlıyor
ayrı geri çağırmalarla veya
Player
alıcıyla birlikte yöntemlerine göz atın. Örneğin,Player.getCurrentWindowIndex()
ile birlikteonTimelineChanged
içinde sağlananTimeline
, yalnızcaonEvents
geri arama. - Dinleyici etkinliklerin mantıksal olarak birlikte gerçekleşip gerçekleşmediğine ilgi gösterir. Örneğin,
örnek, bir medya öğesi nedeniyle
onPlaybackStateChanged
-STATE_BUFFERING
için geçerlidir.
Bazı durumlarda, dinleyicilerin her bir geri çağırmayı
genel onEvents
geri çağırması; örneğin, medya öğesi değişiklik nedenlerini kaydetmek için
onMediaItemTransition
ile ancak yalnızca tüm durum değişiklikleri kullanılabilir bir kez işlem yapın
onEvents
içinde birlikte.
AnalyticsListener
kullanılıyor
ExoPlayer
kullanılırken oynatıcıya AnalyticsListener
kaydedilebilir
addAnalyticsListener
numaralı telefonu arayarak. AnalyticsListener
uygulamaları,
analiz ve günlük kaydı için yararlı olabilecek ayrıntılı etkinlikleri dinleme
amaçlar. Daha fazla bilgi için lütfen analiz sayfasını inceleyin.
EventLogger
kullanılıyor
EventLogger
, doğrudan kitaplık tarafından sağlanan bir AnalyticsListener
amacıyla kullanılabilir. Faydalı özelliklerden yararlanmak için ExoPlayer
öğesine EventLogger
ekleyin
tek satırla ek günlük kaydı yapma:
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
Daha fazla bilgi için hata ayıklama günlük kaydı sayfasını inceleyin.
Belirtilen oynatma konumlarında etkinlikleri tetikleme
Bazı kullanım alanları, etkinliklerin belirli oynatma konumlarında etkinleştirilmesini gerektirir. Bu
PlayerMessage
kullanılarak desteklenir. PlayerMessage
, şunlar kullanılarak oluşturulabilir:
ExoPlayer.createMessage
. Yürütülmesi gereken oynatma konumu
PlayerMessage.setPosition
kullanılarak ayarlanabilir. Mesajlar
oynatma ileti dizisi varsayılan olarak ayarlanır, ancak bu,
PlayerMessage.setLooper
PlayerMessage.setDeleteAfterDelivery
kullanılabilir
mesajın, belirtilen her defasında yürütülüp yürütülmeyeceğini kontrol etmek
oynatma konumu ile karşılaşıldı (bu durum, video oynatma işleminin
veya tekrarlayan modları kullanabilirsiniz. PlayerMessage
yapılandırıldıysa PlayerMessage.send
kullanılarak programlanabilir.
Kotlin
player .createMessage { messageType: Int, payload: Any? -> } .setLooper(Looper.getMainLooper()) .setPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 120000) .setPayload(customPayloadData) .setDeleteAfterDelivery(false) .send()
Java
player .createMessage( (messageType, payload) -> { // Do something at the specified playback position. }) .setLooper(Looper.getMainLooper()) .setPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 120_000) .setPayload(customPayloadData) .setDeleteAfterDelivery(false) .send();