Oyuncu etkinlikleri

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:

  1. reason=DISCONTINUITY_REASON_SEEK ile onPositionDiscontinuity. Bu Player.seekTo çağrısının doğrudan sonucu. Geri aramada PositionInfo var alanlarını genişletmeyi seçin.
  2. 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 veya onMediaItemTransition 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 de onPlayWhenReadyChanged.
  • İş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 birlikte onTimelineChanged içinde sağlanan Timeline, yalnızca onEvents 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();