# AnalyticsListener

Artifact: [androidx.media3:media3-exoplayer](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/exoplayer/analytics/AnalyticsListener.java+class:androidx.media3.exoplayer.analytics.AnalyticsListener)

*** ** * ** ***

<br />

```
public interface AnalyticsListener
```

<br />

Known direct subclasses [EventLogger](https://developer.android.com/reference/androidx/media3/exoplayer/util/EventLogger), [MediaMetricsListener](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener), [PlaybackStatsListener](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlaybackStatsListener), [ReleaseListener](https://developer.android.com/reference/androidx/media3/test/utils/ReleaseListener)

|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/util/EventLogger` | Logs events from `https://developer.android.com/reference/androidx/media3/common/Player` and other core components using `https://developer.android.com/reference/androidx/media3/common/util/Log`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener` | An `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener` that interacts with the Android `https://developer.android.com/reference/android/media/metrics/MediaMetricsManager.html`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlaybackStatsListener` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener` to gather `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlaybackStats` from the player. |
| `https://developer.android.com/reference/androidx/media3/test/utils/ReleaseListener` | A shared `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener` implementation for waiting until `https://developer.android.com/reference/androidx/media3/test/utils/ReleaseListener#onPlayerReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)` is called and all background events have been delivered. |

*** ** * ** ***

A listener for analytics events.

All events are recorded with an `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` specifying the elapsed real time and media time at the time of the event.

All methods have no-op default implementations to allow selective overrides.

Listeners can choose to implement individual events (e.g. `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onIsPlayingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)`) or `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onEvents(androidx.media3.common.Player,androidx.media3.exoplayer.analytics.AnalyticsListener.Events)`, which is called after one or more events occurred together.

## Summary

| ### Nested types |
|---|
| `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi @https://developer.android.com/reference/java/lang/annotation/Documented.html @https://developer.android.com/reference/java/lang/annotation/Retention.html(value = https://developer.android.com/reference/java/lang/annotation/RetentionPolicy.html#SOURCE) @https://developer.android.com/reference/java/lang/annotation/Target.html(value = ) @https://developer.android.com/reference/androidx/annotation/IntDef(value = ) public annotation https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventFlags` Events that can be reported via `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onEvents(androidx.media3.common.Player,androidx.media3.exoplayer.analytics.AnalyticsListener.Events)`. |
| `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi public final class https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` Time information of an event. |
| `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi public final class https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.Events` A set of `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventFlags`. |

| ### Constants |
|---|---|
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_ATTRIBUTES_CHANGED() = 20` Audio attributes changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_CODEC_ERROR() = 1029` The audio codec encountered an error. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_DECODER_INITIALIZED() = 1008` An audio renderer created a decoder. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_DECODER_RELEASED() = 1012` An audio renderer released a decoder. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_DISABLED() = 1013` An audio renderer was disabled. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_ENABLED() = 1007` An audio renderer was enabled. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_INPUT_FORMAT_CHANGED() = 1009` The format consumed by an audio renderer changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_POSITION_ADVANCING() = 1010` The audio position has increased for the first time since the last pause or position reset. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_SESSION_ID() = 21` An audio session id was set. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_SINK_ERROR() = 1014` The audio sink encountered a non-fatal error. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_TRACK_INITIALIZED() = 1031` An audio track has been initialized. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_TRACK_RELEASED() = 1032` An audio track has been released. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AUDIO_UNDERRUN() = 1011` An audio underrun occurred. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_AVAILABLE_COMMANDS_CHANGED() = 13` `https://developer.android.com/reference/androidx/media3/common/Player#getAvailableCommands()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_BANDWIDTH_ESTIMATE() = 1006` The bandwidth estimate has been updated. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_CUES() = 27` `https://developer.android.com/reference/androidx/media3/common/Player#getCurrentCues()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DEVICE_INFO_CHANGED() = 29` `https://developer.android.com/reference/androidx/media3/common/Player#getDeviceInfo()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DEVICE_VOLUME_CHANGED() = 30` `https://developer.android.com/reference/androidx/media3/common/Player#getDeviceVolume()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DOWNSTREAM_FORMAT_CHANGED() = 1004` The downstream format sent to renderers changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_KEYS_LOADED() = 1023` DRM keys were loaded. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_KEYS_REMOVED() = 1026` DRM keys were removed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_KEYS_RESTORED() = 1025` DRM keys were restored. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_SESSION_ACQUIRED() = 1022` A DRM session has been acquired. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_SESSION_MANAGER_ERROR() = 1024` A non-fatal DRM session manager error occurred. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DRM_SESSION_RELEASED() = 1027` A DRM session has been released. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DROPPED_SEEKS_WHILE_SCRUBBING() = 1034` Seeks have been dropped when scrubbing. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_DROPPED_VIDEO_FRAMES() = 1018` Video frames have been dropped. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_IS_LOADING_CHANGED() = 3` `https://developer.android.com/reference/androidx/media3/common/Player#isLoading()` ()} changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_IS_PLAYING_CHANGED() = 7` `https://developer.android.com/reference/androidx/media3/common/Player#isPlaying()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_LOAD_CANCELED() = 1002` A source canceled loading data. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_LOAD_COMPLETED() = 1001` A source started completed loading data. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_LOAD_ERROR() = 1003` A source had a non-fatal error loading data. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_LOAD_STARTED() = 1000` A source started loading data. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED() = 18` `https://developer.android.com/reference/androidx/media3/common/Player#getMaxSeekToPreviousPosition()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_MEDIA_ITEM_TRANSITION() = 1` `https://developer.android.com/reference/androidx/media3/common/Player#getCurrentMediaItem()` changed or the player started repeating the current item. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_MEDIA_METADATA_CHANGED() = 14` `https://developer.android.com/reference/androidx/media3/common/Player#getMediaMetadata()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_METADATA() = 28` Metadata associated with the current playback time was reported. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYBACK_PARAMETERS_CHANGED() = 12` `https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackParameters()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYBACK_STATE_CHANGED() = 4` `https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackState()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED() = 6` `https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackSuppressionReason()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYER_ERROR() = 10` `https://developer.android.com/reference/androidx/media3/common/Player#getPlayerError()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYER_RELEASED() = 1028` The player was released. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAYLIST_METADATA_CHANGED() = 15` `https://developer.android.com/reference/androidx/media3/common/Player#getPlaylistMetadata()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_PLAY_WHEN_READY_CHANGED() = 5` `https://developer.android.com/reference/androidx/media3/common/Player#getPlayWhenReady()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_POSITION_DISCONTINUITY() = 11` A position discontinuity occurred. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_RENDERED_FIRST_FRAME() = 26` The first frame has been rendered since setting the surface, since the renderer was reset or since the stream changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_RENDERER_READY_CHANGED() = 1033` A renderer changed its readiness for playback. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_REPEAT_MODE_CHANGED() = 8` `https://developer.android.com/reference/androidx/media3/common/Player#getRepeatMode()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_SEEK_BACK_INCREMENT_CHANGED() = 16` `https://developer.android.com/reference/androidx/media3/common/Player#getSeekBackIncrement()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_SEEK_FORWARD_INCREMENT_CHANGED() = 17` `https://developer.android.com/reference/androidx/media3/common/Player#getSeekForwardIncrement()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_SHUFFLE_MODE_ENABLED_CHANGED() = 9` `https://developer.android.com/reference/androidx/media3/common/Player#getShuffleModeEnabled()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_SKIP_SILENCE_ENABLED_CHANGED() = 23` Skipping silences was enabled or disabled in the audio stream. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_SURFACE_SIZE_CHANGED() = 24` The surface size changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_TIMELINE_CHANGED() = 0` `https://developer.android.com/reference/androidx/media3/common/Player#getCurrentTimeline()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_TRACKS_CHANGED() = 2` `https://developer.android.com/reference/androidx/media3/common/Player#getCurrentTracks()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_TRACK_SELECTION_PARAMETERS_CHANGED() = 19` `https://developer.android.com/reference/androidx/media3/common/Player#getTrackSelectionParameters()` changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_UPSTREAM_DISCARDED() = 1005` Data was removed from the end of the media buffer. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_CODEC_ERROR() = 1030` The video codec encountered an error. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_DECODER_INITIALIZED() = 1016` A video renderer created a decoder. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_DECODER_RELEASED() = 1019` A video renderer released a decoder. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_DISABLED() = 1020` A video renderer was disabled. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_ENABLED() = 1015` A video renderer was enabled. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_FRAME_PROCESSING_OFFSET() = 1021` Video frame processing offset data has been reported. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_INPUT_FORMAT_CHANGED() = 1017` The format consumed by a video renderer changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VIDEO_SIZE_CHANGED() = 25` The video size changed. |
| `default static final int` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#EVENT_VOLUME_CHANGED() = 22` The volume changed. |

| ### Public methods |
|---|---|
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioAttributesChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.AudioAttributes)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/AudioAttributes audioAttributes )` Called when the audio attributes change. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioCodecError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.Exception)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/Exception.html audioCodecError )` Called when an audio decoder encounters an error. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onAudioDecoderInitialized](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName, long initializationDurationMs )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)`. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName, long initializedTimestampMs, long initializationDurationMs )` Called when an audio renderer creates a decoder. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName )` Called when an audio renderer releases a decoder. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDisabled(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.DecoderCounters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters )` Called when an audio renderer is disabled. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioEnabled(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.DecoderCounters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters )` Called when an audio renderer is enabled. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioInputFormatChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Format,androidx.media3.exoplayer.DecoderReuseEvaluation)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Format format, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/DecoderReuseEvaluation decoderReuseEvaluation )` Called when the format of the media being consumed by an audio renderer changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioPositionAdvancing(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, long playoutStartSystemTimeMs )` Called when the audio position has increased for the first time since the last pause or position reset. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioSessionIdChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int audioSessionId )` Called when the audio session ID changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioSinkError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.Exception)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/Exception.html audioSinkError )` Called when `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink` has encountered an error. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioTrackInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.audio.AudioSink.AudioTrackConfig)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig audioTrackConfig )` Called when an `https://developer.android.com/reference/android/media/AudioTrack.html` has been initialized. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioTrackReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.audio.AudioSink.AudioTrackConfig)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig audioTrackConfig )` Called when an `https://developer.android.com/reference/android/media/AudioTrack.html` has been released. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioUnderrun(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,long,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs )` Called when an audio underrun occurs. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAvailableCommandsChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.Commands)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Player.Commands availableCommands )` Called when the player's available commands changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onBandwidthEstimate(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,long,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int totalLoadTimeMs, long totalBytesLoaded, long bitrateEstimate )` Called when the bandwidth estimate for the current data source has been updated. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.text.CueGroup)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/text/CueGroup cueGroup)` Called when there is a change in the `https://developer.android.com/reference/androidx/media3/common/text/CueGroup`. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onCues](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.util.List<androidx.media3.common.text.Cue>))(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/androidx/media3/common/text/Cue> cues)` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.text.CueGroup)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDeviceInfoChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.DeviceInfo)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/DeviceInfo deviceInfo )` Called when the device information changes |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDeviceVolumeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int volume, boolean muted )` Called when the device volume or mute state changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDownstreamFormatChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.MediaLoadData)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData )` Called when the downstream format sent to the renderers changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onDrmKeysLoaded](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysLoaded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` **This method is deprecated.** Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysLoaded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.drm.KeyRequestInfo)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysLoaded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.drm.KeyRequestInfo)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/drm/KeyRequestInfo keyRequestInfo )` Called each time drm keys are loaded. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysRemoved(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` Called each time offline drm keys are removed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysRestored(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` Called each time offline drm keys are restored. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onDrmSessionAcquired](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionAcquired(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` **This method is deprecated.** Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionAcquired(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionAcquired(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSession.State int state )` Called each time a drm session is acquired. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionManagerError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.Exception)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/Exception.html error )` Called when a drm error occurs. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` Called each time a drm session is released. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDroppedSeeksWhileScrubbing(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int droppedSeeks )` Called when seeks have been dropped while in `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer#setScrubbingModeEnabled(boolean)`. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDroppedVideoFrames(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int droppedFrames, long elapsedMs )` Called after video frames have been dropped. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onEvents(androidx.media3.common.Player,androidx.media3.exoplayer.analytics.AnalyticsListener.Events)(https://developer.android.com/reference/androidx/media3/common/Player player, https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.Events events)` Called after one or more events occurred. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onIsLoadingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean isLoading )` Called when the player starts or stops loading data from a source. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onIsPlayingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean isPlaying )` Called when the player starts or stops playing. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadCanceled(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData )` Called when a media source canceled loading data. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadCompleted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData )` Called when a media source completed loading data. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData,java.io.IOException,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData, https://developer.android.com/reference/java/io/IOException.html error, boolean wasCanceled )` Called when a media source loading error occurred. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onLoadStarted](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData )` **This method is deprecated.** Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData,int)` instead, and check for `retryCount == 0` for equivalent behavior. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData, int retryCount )` Called when a media source started loading data. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onLoadingChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean isLoading )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onIsLoadingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMaxSeekToPreviousPositionChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, long maxSeekToPreviousPositionMs )` Called when the maximum position for which `https://developer.android.com/reference/androidx/media3/common/Player#seekToPrevious()` seeks to the previous window changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMediaItemTransition(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.MediaItem,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/MediaItem mediaItem, @https://developer.android.com/reference/androidx/media3/common/Player.MediaItemTransitionReason int reason )` Called when playback transitions to a different media item. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMediaMetadataChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.MediaMetadata)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/MediaMetadata mediaMetadata )` Called when the combined `https://developer.android.com/reference/androidx/media3/common/MediaMetadata` changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMetadata(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Metadata)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Metadata metadata)` Called when there is `https://developer.android.com/reference/androidx/media3/common/Metadata` associated with the current playback time. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayWhenReadyChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean playWhenReady, @https://developer.android.com/reference/androidx/media3/common/Player.PlayWhenReadyChangeReason int reason )` Called when the value changed that indicates whether playback will proceed when ready. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackParametersChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.PlaybackParameters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/PlaybackParameters playbackParameters )` Called when the playback parameters changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/common/Player.State int state )` Called when the playback state changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackSuppressionReasonChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/common/Player.PlaybackSuppressionReason int playbackSuppressionReason )` Called when playback suppression reason changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayerError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.PlaybackException)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/PlaybackException error )` Called when a fatal player error occurred. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayerErrorChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.PlaybackException)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/PlaybackException error )` Called when the `https://developer.android.com/reference/androidx/media3/common/PlaybackException` returned by `https://developer.android.com/reference/androidx/media3/common/Player#getPlayerError()` changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayerReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` Called when the `https://developer.android.com/reference/androidx/media3/common/Player` is released. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onPlayerStateChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayerStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean playWhenReady, @https://developer.android.com/reference/androidx/media3/common/Player.State int playbackState )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` and `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayWhenReadyChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaylistMetadataChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.MediaMetadata)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/MediaMetadata playlistMetadata )` Called when the playlist `https://developer.android.com/reference/androidx/media3/common/MediaMetadata` changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onPositionDiscontinuity](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/common/Player.DiscontinuityReason int reason )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Player.PositionInfo oldPosition, https://developer.android.com/reference/androidx/media3/common/Player.PositionInfo newPosition, @https://developer.android.com/reference/androidx/media3/common/Player.DiscontinuityReason int reason )` Called when a position discontinuity occurred. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onRenderedFirstFrame(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.Object,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/Object.html output, long renderTimeMs )` Called when a frame is rendered for the first time since setting the surface, or since the renderer was reset, or since the stream being rendered was changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onRendererReadyChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,int,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int rendererIndex, @https://developer.android.com/reference/androidx/media3/common/C.TrackType int rendererTrackType, boolean isRendererReady )` Called each time a renderer starts or stops allowing playback to be ready. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onRepeatModeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/common/Player.RepeatMode int repeatMode )` Called when the repeat mode changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSeekBackIncrementChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, long seekBackIncrementMs )` Called when the seek back increment changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSeekForwardIncrementChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, long seekForwardIncrementMs )` Called when the seek forward increment changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onSeekStarted](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSeekStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime)` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)` instead, listening to changes with `https://developer.android.com/reference/androidx/media3/common/Player#DISCONTINUITY_REASON_SEEK()`. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onShuffleModeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean shuffleModeEnabled )` Called when the shuffle mode changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSkipSilenceEnabledChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, boolean skipSilenceEnabled )` Called when skipping silences is enabled or disabled in the audio stream. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSurfaceSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int width, int height )` Called when the output surface size changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onTimelineChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, @https://developer.android.com/reference/androidx/media3/common/Player.TimelineChangeReason int reason )` Called when the timeline changed. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onTrackSelectionParametersChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.TrackSelectionParameters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/TrackSelectionParameters trackSelectionParameters )` Called when track selection parameters change. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onTracksChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Tracks)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Tracks tracks)` Called when the tracks change. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onUpstreamDiscarded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.MediaLoadData)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData )` Called when data is removed from the back of a media buffer, typically so that it can be re-buffered in a different format. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoCodecError(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.Exception)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/Exception.html videoCodecError )` Called when a video decoder encounters an error. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onVideoDecoderInitialized](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName, long initializationDurationMs )` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)`. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName, long initializedTimestampMs, long initializationDurationMs )` Called when a video renderer creates a decoder. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderReleased(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html decoderName )` Called when a video renderer releases a decoder. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDisabled(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.DecoderCounters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters )` Called when a video renderer is disabled. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoEnabled(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.DecoderCounters)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters )` Called when a video renderer is enabled. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoFrameProcessingOffset(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,long,int)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, long totalProcessingOffsetUs, int frameCount )` Called when there is an update to the video frame processing offset reported by a video renderer. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoInputFormatChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Format,androidx.media3.exoplayer.DecoderReuseEvaluation)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/Format format, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/DecoderReuseEvaluation decoderReuseEvaluation )` Called when the format of the media being consumed by a video renderer changes. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.VideoSize)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/androidx/media3/common/VideoSize videoSize )` Called before a frame is rendered for the first time since setting the surface, and each time there's a change in the size or pixel aspect ratio of the video being rendered. |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi [onVideoSizeChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,int,int,float))( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio )` **This method is deprecated.** Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.VideoSize)` instead. <br /> |
| `default void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVolumeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,float)(https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, float volume)` Called when the volume changes. |

## Constants

### EVENT_AUDIO_ATTRIBUTES_CHANGED

```
@UnstableApi
default static final int EVENT_AUDIO_ATTRIBUTES_CHANGED = 20
```

Audio attributes changed.

### EVENT_AUDIO_CODEC_ERROR

```
@UnstableApi
default static final int EVENT_AUDIO_CODEC_ERROR = 1029
```

The audio codec encountered an error.

### EVENT_AUDIO_DECODER_INITIALIZED

```
@UnstableApi
default static final int EVENT_AUDIO_DECODER_INITIALIZED = 1008
```

An audio renderer created a decoder.

### EVENT_AUDIO_DECODER_RELEASED

```
@UnstableApi
default static final int EVENT_AUDIO_DECODER_RELEASED = 1012
```

An audio renderer released a decoder.

### EVENT_AUDIO_DISABLED

```
@UnstableApi
default static final int EVENT_AUDIO_DISABLED = 1013
```

An audio renderer was disabled.

### EVENT_AUDIO_ENABLED

```
@UnstableApi
default static final int EVENT_AUDIO_ENABLED = 1007
```

An audio renderer was enabled.

### EVENT_AUDIO_INPUT_FORMAT_CHANGED

```
@UnstableApi
default static final int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1009
```

The format consumed by an audio renderer changed.

### EVENT_AUDIO_POSITION_ADVANCING

```
@UnstableApi
default static final int EVENT_AUDIO_POSITION_ADVANCING = 1010
```

The audio position has increased for the first time since the last pause or position reset.

### EVENT_AUDIO_SESSION_ID

```
@UnstableApi
default static final int EVENT_AUDIO_SESSION_ID = 21
```

An audio session id was set.

### EVENT_AUDIO_SINK_ERROR

```
@UnstableApi
default static final int EVENT_AUDIO_SINK_ERROR = 1014
```

The audio sink encountered a non-fatal error.

### EVENT_AUDIO_TRACK_INITIALIZED

```
@UnstableApi
default static final int EVENT_AUDIO_TRACK_INITIALIZED = 1031
```

An audio track has been initialized.

### EVENT_AUDIO_TRACK_RELEASED

```
@UnstableApi
default static final int EVENT_AUDIO_TRACK_RELEASED = 1032
```

An audio track has been released.

### EVENT_AUDIO_UNDERRUN

```
@UnstableApi
default static final int EVENT_AUDIO_UNDERRUN = 1011
```

An audio underrun occurred.

### EVENT_AVAILABLE_COMMANDS_CHANGED

```
@UnstableApi
default static final int EVENT_AVAILABLE_COMMANDS_CHANGED = 13
```

`https://developer.android.com/reference/androidx/media3/common/Player#getAvailableCommands()` changed.

### EVENT_BANDWIDTH_ESTIMATE

```
@UnstableApi
default static final int EVENT_BANDWIDTH_ESTIMATE = 1006
```

The bandwidth estimate has been updated.

### EVENT_CUES

```
@UnstableApi
default static final int EVENT_CUES = 27
```

`https://developer.android.com/reference/androidx/media3/common/Player#getCurrentCues()` changed.

### EVENT_DEVICE_INFO_CHANGED

```
@UnstableApi
default static final int EVENT_DEVICE_INFO_CHANGED = 29
```

`https://developer.android.com/reference/androidx/media3/common/Player#getDeviceInfo()` changed.

### EVENT_DEVICE_VOLUME_CHANGED

```
@UnstableApi
default static final int EVENT_DEVICE_VOLUME_CHANGED = 30
```

`https://developer.android.com/reference/androidx/media3/common/Player#getDeviceVolume()` changed.

### EVENT_DOWNSTREAM_FORMAT_CHANGED

```
@UnstableApi
default static final int EVENT_DOWNSTREAM_FORMAT_CHANGED = 1004
```

The downstream format sent to renderers changed.

### EVENT_DRM_KEYS_LOADED

```
@UnstableApi
default static final int EVENT_DRM_KEYS_LOADED = 1023
```

DRM keys were loaded.

### EVENT_DRM_KEYS_REMOVED

```
@UnstableApi
default static final int EVENT_DRM_KEYS_REMOVED = 1026
```

DRM keys were removed.

### EVENT_DRM_KEYS_RESTORED

```
@UnstableApi
default static final int EVENT_DRM_KEYS_RESTORED = 1025
```

DRM keys were restored.

### EVENT_DRM_SESSION_ACQUIRED

```
@UnstableApi
default static final int EVENT_DRM_SESSION_ACQUIRED = 1022
```

A DRM session has been acquired.

### EVENT_DRM_SESSION_MANAGER_ERROR

```
@UnstableApi
default static final int EVENT_DRM_SESSION_MANAGER_ERROR = 1024
```

A non-fatal DRM session manager error occurred.

### EVENT_DRM_SESSION_RELEASED

```
@UnstableApi
default static final int EVENT_DRM_SESSION_RELEASED = 1027
```

A DRM session has been released.

### EVENT_DROPPED_SEEKS_WHILE_SCRUBBING

```
@UnstableApi
default static final int EVENT_DROPPED_SEEKS_WHILE_SCRUBBING = 1034
```

Seeks have been dropped when scrubbing.

### EVENT_DROPPED_VIDEO_FRAMES

```
@UnstableApi
default static final int EVENT_DROPPED_VIDEO_FRAMES = 1018
```

Video frames have been dropped.

### EVENT_IS_LOADING_CHANGED

```
@UnstableApi
default static final int EVENT_IS_LOADING_CHANGED = 3
```

`https://developer.android.com/reference/androidx/media3/common/Player#isLoading()` ()} changed.

### EVENT_IS_PLAYING_CHANGED

```
@UnstableApi
default static final int EVENT_IS_PLAYING_CHANGED = 7
```

`https://developer.android.com/reference/androidx/media3/common/Player#isPlaying()` changed.

### EVENT_LOAD_CANCELED

```
@UnstableApi
default static final int EVENT_LOAD_CANCELED = 1002
```

A source canceled loading data.

### EVENT_LOAD_COMPLETED

```
@UnstableApi
default static final int EVENT_LOAD_COMPLETED = 1001
```

A source started completed loading data.

### EVENT_LOAD_ERROR

```
@UnstableApi
default static final int EVENT_LOAD_ERROR = 1003
```

A source had a non-fatal error loading data.

### EVENT_LOAD_STARTED

```
@UnstableApi
default static final int EVENT_LOAD_STARTED = 1000
```

A source started loading data.

### EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED

```
@UnstableApi
default static final int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 18
```

`https://developer.android.com/reference/androidx/media3/common/Player#getMaxSeekToPreviousPosition()` changed.

### EVENT_MEDIA_ITEM_TRANSITION

```
@UnstableApi
default static final int EVENT_MEDIA_ITEM_TRANSITION = 1
```

`https://developer.android.com/reference/androidx/media3/common/Player#getCurrentMediaItem()` changed or the player started repeating the current item.

### EVENT_MEDIA_METADATA_CHANGED

```
@UnstableApi
default static final int EVENT_MEDIA_METADATA_CHANGED = 14
```

`https://developer.android.com/reference/androidx/media3/common/Player#getMediaMetadata()` changed.

### EVENT_METADATA

```
@UnstableApi
default static final int EVENT_METADATA = 28
```

Metadata associated with the current playback time was reported.

### EVENT_PLAYBACK_PARAMETERS_CHANGED

```
@UnstableApi
default static final int EVENT_PLAYBACK_PARAMETERS_CHANGED = 12
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackParameters()` changed.

### EVENT_PLAYBACK_STATE_CHANGED

```
@UnstableApi
default static final int EVENT_PLAYBACK_STATE_CHANGED = 4
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackState()` changed.

### EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED

```
@UnstableApi
default static final int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = 6
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlaybackSuppressionReason()` changed.

### EVENT_PLAYER_ERROR

```
@UnstableApi
default static final int EVENT_PLAYER_ERROR = 10
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlayerError()` changed.

### EVENT_PLAYER_RELEASED

```
@UnstableApi
default static final int EVENT_PLAYER_RELEASED = 1028
```

The player was released.

### EVENT_PLAYLIST_METADATA_CHANGED

```
@UnstableApi
default static final int EVENT_PLAYLIST_METADATA_CHANGED = 15
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlaylistMetadata()` changed.

### EVENT_PLAY_WHEN_READY_CHANGED

```
@UnstableApi
default static final int EVENT_PLAY_WHEN_READY_CHANGED = 5
```

`https://developer.android.com/reference/androidx/media3/common/Player#getPlayWhenReady()` changed.

### EVENT_POSITION_DISCONTINUITY

```
@UnstableApi
default static final int EVENT_POSITION_DISCONTINUITY = 11
```

A position discontinuity occurred. See `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPositionDiscontinuity(androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)`.

### EVENT_RENDERED_FIRST_FRAME

```
@UnstableApi
default static final int EVENT_RENDERED_FIRST_FRAME = 26
```

The first frame has been rendered since setting the surface, since the renderer was reset or since the stream changed.

### EVENT_RENDERER_READY_CHANGED

```
@UnstableApi
default static final int EVENT_RENDERER_READY_CHANGED = 1033
```

A renderer changed its readiness for playback.

### EVENT_REPEAT_MODE_CHANGED

```
@UnstableApi
default static final int EVENT_REPEAT_MODE_CHANGED = 8
```

`https://developer.android.com/reference/androidx/media3/common/Player#getRepeatMode()` changed.

### EVENT_SEEK_BACK_INCREMENT_CHANGED

```
@UnstableApi
default static final int EVENT_SEEK_BACK_INCREMENT_CHANGED = 16
```

`https://developer.android.com/reference/androidx/media3/common/Player#getSeekBackIncrement()` changed.

### EVENT_SEEK_FORWARD_INCREMENT_CHANGED

```
@UnstableApi
default static final int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 17
```

`https://developer.android.com/reference/androidx/media3/common/Player#getSeekForwardIncrement()` changed.

### EVENT_SHUFFLE_MODE_ENABLED_CHANGED

```
@UnstableApi
default static final int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = 9
```

`https://developer.android.com/reference/androidx/media3/common/Player#getShuffleModeEnabled()` changed.

### EVENT_SKIP_SILENCE_ENABLED_CHANGED

```
@UnstableApi
default static final int EVENT_SKIP_SILENCE_ENABLED_CHANGED = 23
```

Skipping silences was enabled or disabled in the audio stream.

### EVENT_SURFACE_SIZE_CHANGED

```
@UnstableApi
default static final int EVENT_SURFACE_SIZE_CHANGED = 24
```

The surface size changed.

### EVENT_TIMELINE_CHANGED

```
@UnstableApi
default static final int EVENT_TIMELINE_CHANGED = 0
```

`https://developer.android.com/reference/androidx/media3/common/Player#getCurrentTimeline()` changed.

### EVENT_TRACKS_CHANGED

```
@UnstableApi
default static final int EVENT_TRACKS_CHANGED = 2
```

`https://developer.android.com/reference/androidx/media3/common/Player#getCurrentTracks()` changed.

### EVENT_TRACK_SELECTION_PARAMETERS_CHANGED

```
@UnstableApi
default static final int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 19
```

`https://developer.android.com/reference/androidx/media3/common/Player#getTrackSelectionParameters()` changed.

### EVENT_UPSTREAM_DISCARDED

```
@UnstableApi
default static final int EVENT_UPSTREAM_DISCARDED = 1005
```

Data was removed from the end of the media buffer.

### EVENT_VIDEO_CODEC_ERROR

```
@UnstableApi
default static final int EVENT_VIDEO_CODEC_ERROR = 1030
```

The video codec encountered an error.

### EVENT_VIDEO_DECODER_INITIALIZED

```
@UnstableApi
default static final int EVENT_VIDEO_DECODER_INITIALIZED = 1016
```

A video renderer created a decoder.

### EVENT_VIDEO_DECODER_RELEASED

```
@UnstableApi
default static final int EVENT_VIDEO_DECODER_RELEASED = 1019
```

A video renderer released a decoder.

### EVENT_VIDEO_DISABLED

```
@UnstableApi
default static final int EVENT_VIDEO_DISABLED = 1020
```

A video renderer was disabled.

### EVENT_VIDEO_ENABLED

```
@UnstableApi
default static final int EVENT_VIDEO_ENABLED = 1015
```

A video renderer was enabled.

### EVENT_VIDEO_FRAME_PROCESSING_OFFSET

```
@UnstableApi
default static final int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1021
```

Video frame processing offset data has been reported.

### EVENT_VIDEO_INPUT_FORMAT_CHANGED

```
@UnstableApi
default static final int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1017
```

The format consumed by a video renderer changed.

### EVENT_VIDEO_SIZE_CHANGED

```
@UnstableApi
default static final int EVENT_VIDEO_SIZE_CHANGED = 25
```

The video size changed.

### EVENT_VOLUME_CHANGED

```
@UnstableApi
default static final int EVENT_VOLUME_CHANGED = 22
```

The volume changed.

## Public methods

### onAudioAttributesChanged

```
@UnstableApi
default void onAudioAttributesChanged(
    AnalyticsListener.EventTime eventTime,
    AudioAttributes audioAttributes
)
```

Called when the audio attributes change.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/AudioAttributes audioAttributes` | The audio attributes. |

### onAudioCodecError

```
@UnstableApi
default void onAudioCodecError(
    AnalyticsListener.EventTime eventTime,
    Exception audioCodecError
)
```

Called when an audio decoder encounters an error.

This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should *not* implement this method to display a user visible error or initiate an application level retry. `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPlayerError(androidx.media3.common.PlaybackException)` is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/Exception.html audioCodecError` | The error. Typically a `https://developer.android.com/reference/android/media/MediaCodec.CodecException.html` if the renderer uses `https://developer.android.com/reference/android/media/MediaCodec.html`, or a `https://developer.android.com/reference/androidx/media3/decoder/DecoderException` if the renderer uses a software decoder. |

### onAudioDecoderInitialized

```
@UnstableApi
default void [onAudioDecoderInitialized](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long))(
    AnalyticsListener.EventTime eventTime,
    String decoderName,
    long initializationDurationMs
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onAudioDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)`.

### onAudioDecoderInitialized

```
@UnstableApi
default void onAudioDecoderInitialized(
    AnalyticsListener.EventTime eventTime,
    String decoderName,
    long initializedTimestampMs,
    long initializationDurationMs
)
```

Called when an audio renderer creates a decoder.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/String.html decoderName` | The decoder that was created. |
| `long initializedTimestampMs` | `https://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()` when initialization finished. |
| `long initializationDurationMs` | The time taken to initialize the decoder in milliseconds. |

### onAudioDecoderReleased

```
@UnstableApi
default void onAudioDecoderReleased(
    AnalyticsListener.EventTime eventTime,
    String decoderName
)
```

Called when an audio renderer releases a decoder.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/String.html decoderName` | The decoder that was released. |

### onAudioDisabled

```
@UnstableApi
default void onAudioDisabled(
    AnalyticsListener.EventTime eventTime,
    DecoderCounters decoderCounters
)
```

Called when an audio renderer is disabled.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters` | `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters` that were updated by the renderer. |

### onAudioEnabled

```
@UnstableApi
default void onAudioEnabled(
    AnalyticsListener.EventTime eventTime,
    DecoderCounters decoderCounters
)
```

Called when an audio renderer is enabled.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters` | `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters` that will be updated by the renderer for as long as it remains enabled. |

### onAudioInputFormatChanged

```
@UnstableApi
default void onAudioInputFormatChanged(
    AnalyticsListener.EventTime eventTime,
    Format format,
    @Nullable DecoderReuseEvaluation decoderReuseEvaluation
)
```

Called when the format of the media being consumed by an audio renderer changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Format format` | The new format. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/DecoderReuseEvaluation decoderReuseEvaluation` | The result of the evaluation to determine whether an existing decoder instance can be reused for the new format, or `null` if the renderer did not have a decoder. |

### onAudioPositionAdvancing

```
@UnstableApi
default void onAudioPositionAdvancing(
    AnalyticsListener.EventTime eventTime,
    long playoutStartSystemTimeMs
)
```

Called when the audio position has increased for the first time since the last pause or position reset.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `long playoutStartSystemTimeMs` | The approximate derived `https://developer.android.com/reference/java/lang/System.html#currentTimeMillis()` at which playout started. |

### onAudioSessionIdChanged

```
@UnstableApi
default void onAudioSessionIdChanged(
    AnalyticsListener.EventTime eventTime,
    int audioSessionId
)
```

Called when the audio session ID changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int audioSessionId` | The audio session ID. |

### onAudioSinkError

```
@UnstableApi
default void onAudioSinkError(
    AnalyticsListener.EventTime eventTime,
    Exception audioSinkError
)
```

Called when `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink` has encountered an error.

This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should *not* implement this method to display a user visible error or initiate an application level retry. `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPlayerError(androidx.media3.common.PlaybackException)` is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/Exception.html audioSinkError` | The error that occurred. Typically an `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.InitializationException`, a `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.WriteException`, or an `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.UnexpectedDiscontinuityException`. |

### onAudioTrackInitialized

```
@UnstableApi
default void onAudioTrackInitialized(
    AnalyticsListener.EventTime eventTime,
    AudioSink.AudioTrackConfig audioTrackConfig
)
```

Called when an `https://developer.android.com/reference/android/media/AudioTrack.html` has been initialized.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig audioTrackConfig` | The `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig` of the initialized `https://developer.android.com/reference/android/media/AudioTrack.html`. |

### onAudioTrackReleased

```
@UnstableApi
default void onAudioTrackReleased(
    AnalyticsListener.EventTime eventTime,
    AudioSink.AudioTrackConfig audioTrackConfig
)
```

Called when an `https://developer.android.com/reference/android/media/AudioTrack.html` has been released.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig audioTrackConfig` | The `https://developer.android.com/reference/androidx/media3/exoplayer/audio/AudioSink.AudioTrackConfig` of the released `https://developer.android.com/reference/android/media/AudioTrack.html`. |

### onAudioUnderrun

```
@UnstableApi
default void onAudioUnderrun(
    AnalyticsListener.EventTime eventTime,
    int bufferSize,
    long bufferSizeMs,
    long elapsedSinceLastFeedMs
)
```

Called when an audio underrun occurs.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int bufferSize` | The size of the audio output buffer, in bytes. |
| `long bufferSizeMs` | The size of the audio output buffer, in milliseconds, if it contains PCM encoded audio. `https://developer.android.com/reference/androidx/media3/common/C#TIME_UNSET()` if the output buffer contains non-PCM encoded audio. |
| `long elapsedSinceLastFeedMs` | The time since audio was last written to the output buffer. |

### onAvailableCommandsChanged

```
@UnstableApi
default void onAvailableCommandsChanged(
    AnalyticsListener.EventTime eventTime,
    Player.Commands availableCommands
)
```

Called when the player's available commands changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Player.Commands availableCommands` | The available commands. |

### onBandwidthEstimate

```
@UnstableApi
default void onBandwidthEstimate(
    AnalyticsListener.EventTime eventTime,
    int totalLoadTimeMs,
    long totalBytesLoaded,
    long bitrateEstimate
)
```

Called when the bandwidth estimate for the current data source has been updated.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int totalLoadTimeMs` | The total time spend loading this update is based on, in milliseconds. |
| `long totalBytesLoaded` | The total bytes loaded this update is based on. |
| `long bitrateEstimate` | The bandwidth estimate, in bits per second. |

### onCues

```
@UnstableApi
default void onCues(AnalyticsListener.EventTime eventTime, CueGroup cueGroup)
```

Called when there is a change in the `https://developer.android.com/reference/androidx/media3/common/text/CueGroup`.

Both `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.util.List<androidx.media3.common.text.Cue>)` and `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.text.CueGroup)` are called when there is a change in the cues. You should only implement one or the other.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/text/CueGroup cueGroup` | The `https://developer.android.com/reference/androidx/media3/common/text/CueGroup`. |

### onCues

```
@UnstableApi
default void [onCues](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.util.List<androidx.media3.common.text.Cue>))(AnalyticsListener.EventTime eventTime, List<Cue> cues)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.text.CueGroup)` instead.

Called when there is a change in the `https://developer.android.com/reference/androidx/media3/common/text/Cue`.

Both `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.util.List<androidx.media3.common.text.Cue>)` and `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onCues(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.text.CueGroup)` are called when there is a change in the cues. You should only implement one or the other.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/androidx/media3/common/text/Cue> cues` | The `https://developer.android.com/reference/androidx/media3/common/text/Cue`. |

### onDeviceInfoChanged

```
@UnstableApi
default void onDeviceInfoChanged(
    AnalyticsListener.EventTime eventTime,
    DeviceInfo deviceInfo
)
```

Called when the device information changes

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/DeviceInfo deviceInfo` | The new `https://developer.android.com/reference/androidx/media3/common/DeviceInfo`. |

### onDeviceVolumeChanged

```
@UnstableApi
default void onDeviceVolumeChanged(
    AnalyticsListener.EventTime eventTime,
    int volume,
    boolean muted
)
```

Called when the device volume or mute state changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int volume` | The new device volume, with 0 being silence and 1 being unity gain. |
| `boolean muted` | Whether the device is muted. |

### onDownstreamFormatChanged

```
@UnstableApi
default void onDownstreamFormatChanged(
    AnalyticsListener.EventTime eventTime,
    MediaLoadData mediaLoadData
)
```

Called when the downstream format sent to the renderers changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the newly selected media data. |

### onDrmKeysLoaded

```
@UnstableApi
default void [onDrmKeysLoaded](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysLoaded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(AnalyticsListener.EventTime eventTime)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmKeysLoaded(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.drm.KeyRequestInfo)` instead.

### onDrmKeysLoaded

```
@UnstableApi
default void onDrmKeysLoaded(
    AnalyticsListener.EventTime eventTime,
    KeyRequestInfo keyRequestInfo
)
```

Called each time drm keys are loaded.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/drm/KeyRequestInfo keyRequestInfo` | information for any required load operation, null if none |

### onDrmKeysRemoved

```
@UnstableApi
default void onDrmKeysRemoved(AnalyticsListener.EventTime eventTime)
```

Called each time offline drm keys are removed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |

### onDrmKeysRestored

```
@UnstableApi
default void onDrmKeysRestored(AnalyticsListener.EventTime eventTime)
```

Called each time offline drm keys are restored.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |

### onDrmSessionAcquired

```
@UnstableApi
default void [onDrmSessionAcquired](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionAcquired(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(AnalyticsListener.EventTime eventTime)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onDrmSessionAcquired(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` instead.

### onDrmSessionAcquired

```
@UnstableApi
default void onDrmSessionAcquired(
    AnalyticsListener.EventTime eventTime,
    @DrmSession.State int state
)
```

Called each time a drm session is acquired.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSession.State int state` | The `https://developer.android.com/reference/androidx/media3/exoplayer/drm/DrmSession.State` of the session when the acquisition completed. |

### onDrmSessionManagerError

```
@UnstableApi
default void onDrmSessionManagerError(
    AnalyticsListener.EventTime eventTime,
    Exception error
)
```

Called when a drm error occurs.

This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should *not* implement this method to display a user visible error or initiate an application level retry. `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPlayerError(androidx.media3.common.PlaybackException)` is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/Exception.html error` | The error. |

### onDrmSessionReleased

```
@UnstableApi
default void onDrmSessionReleased(AnalyticsListener.EventTime eventTime)
```

Called each time a drm session is released.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |

### onDroppedSeeksWhileScrubbing

```
@UnstableApi
default void onDroppedSeeksWhileScrubbing(
    AnalyticsListener.EventTime eventTime,
    int droppedSeeks
)
```

Called when seeks have been dropped while in `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer#setScrubbingModeEnabled(boolean)`.

Seeks are dropped in scrubbing mode when at least two calls are made to `https://developer.android.com/reference/androidx/media3/common/Player#seekTo(long)` while an earlier call to `https://developer.android.com/reference/androidx/media3/common/Player#seekTo(long)` is still being processed (i.e. the resulting frame hasn't been rendered/released yet). The most recent seek is queued to process later and any intermediate seeks are dropped.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int droppedSeeks` | The number of dropped seeks since the last call to this method. |

### onDroppedVideoFrames

```
@UnstableApi
default void onDroppedVideoFrames(
    AnalyticsListener.EventTime eventTime,
    int droppedFrames,
    long elapsedMs
)
```

Called after video frames have been dropped.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int droppedFrames` | The number of dropped frames since the last call to this method. |
| `long elapsedMs` | The duration in milliseconds over which the frames were dropped. This duration is timed from when the renderer was started or from when dropped frames were last reported (whichever was more recent), and not from when the first of the reported drops occurred. |

### onEvents

```
@UnstableApi
default void onEvents(Player player, AnalyticsListener.Events events)
```

Called after one or more events occurred.

State changes and events that happen within one `https://developer.android.com/reference/android/os/Looper.html` message queue iteration are reported together and only after all individual callbacks were triggered.

Listeners should prefer this method over individual callbacks in the following cases:

- They intend to trigger the same logic for multiple events (e.g. when updating a UI for both `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` and `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayWhenReadyChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int)`).
- They need access to the `https://developer.android.com/reference/androidx/media3/common/Player` object to trigger further events (e.g. to call `https://developer.android.com/reference/androidx/media3/common/Player#seekTo(long)` after a `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMediaItemTransition(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.MediaItem,int)`).
- They intend to use multiple state values together or in combination with `https://developer.android.com/reference/androidx/media3/common/Player` getter methods. For example using `https://developer.android.com/reference/androidx/media3/common/Player#getCurrentMediaItemIndex()` with the `timeline` provided in `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onTimelineChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` is only safe from within this method.
- They are interested in events that logically happened together (e.g `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` to `https://developer.android.com/reference/androidx/media3/common/Player#STATE_BUFFERING()` because of `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onMediaItemTransition(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.MediaItem,int)`).

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Player player` | The `https://developer.android.com/reference/androidx/media3/common/Player`. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.Events events` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.Events` that occurred in this iteration. |

### onIsLoadingChanged

```
@UnstableApi
default void onIsLoadingChanged(
    AnalyticsListener.EventTime eventTime,
    boolean isLoading
)
```

Called when the player starts or stops loading data from a source.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `boolean isLoading` | Whether the player is loading. |

### onIsPlayingChanged

```
@UnstableApi
default void onIsPlayingChanged(
    AnalyticsListener.EventTime eventTime,
    boolean isPlaying
)
```

Called when the player starts or stops playing.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `boolean isPlaying` | Whether the player is playing. |

### onLoadCanceled

```
@UnstableApi
default void onLoadCanceled(
    AnalyticsListener.EventTime eventTime,
    LoadEventInfo loadEventInfo,
    MediaLoadData mediaLoadData
)
```

Called when a media source canceled loading data.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo` defining the load event. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the data being loaded. |

### onLoadCompleted

```
@UnstableApi
default void onLoadCompleted(
    AnalyticsListener.EventTime eventTime,
    LoadEventInfo loadEventInfo,
    MediaLoadData mediaLoadData
)
```

Called when a media source completed loading data.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo` defining the load event. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the data being loaded. |

### onLoadError

```
@UnstableApi
default void onLoadError(
    AnalyticsListener.EventTime eventTime,
    LoadEventInfo loadEventInfo,
    MediaLoadData mediaLoadData,
    IOException error,
    boolean wasCanceled
)
```

Called when a media source loading error occurred.

This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should *not* implement this method to display a user visible error or initiate an application level retry. `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPlayerError(androidx.media3.common.PlaybackException)` is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo` defining the load event. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the data being loaded. |
| `https://developer.android.com/reference/java/io/IOException.html error` | The load error. |
| `boolean wasCanceled` | Whether the load was canceled as a result of the error. |

### onLoadStarted

```
@UnstableApi
default void [onLoadStarted](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData))(
    AnalyticsListener.EventTime eventTime,
    LoadEventInfo loadEventInfo,
    MediaLoadData mediaLoadData
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData,int)` instead, and check for `retryCount == 0` for equivalent behavior.

### onLoadStarted

```
@UnstableApi
default void onLoadStarted(
    AnalyticsListener.EventTime eventTime,
    LoadEventInfo loadEventInfo,
    MediaLoadData mediaLoadData,
    int retryCount
)
```

Called when a media source started loading data.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo loadEventInfo` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/LoadEventInfo` defining the load event. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the data being loaded. |
| `int retryCount` | The number of failed attempts since `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)` was called (this is zero for the first load attempt). |

### onLoadingChanged

```
@UnstableApi
default void [onLoadingChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onLoadingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean))(
    AnalyticsListener.EventTime eventTime,
    boolean isLoading
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onIsLoadingChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean)` instead.

### onMaxSeekToPreviousPositionChanged

```
@UnstableApi
default void onMaxSeekToPreviousPositionChanged(
    AnalyticsListener.EventTime eventTime,
    long maxSeekToPreviousPositionMs
)
```

Called when the maximum position for which `https://developer.android.com/reference/androidx/media3/common/Player#seekToPrevious()` seeks to the previous window changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `long maxSeekToPreviousPositionMs` | The maximum seek to previous position, in milliseconds. |

### onMediaItemTransition

```
@UnstableApi
default void onMediaItemTransition(
    AnalyticsListener.EventTime eventTime,
    @Nullable MediaItem mediaItem,
    @Player.MediaItemTransitionReason int reason
)
```

Called when playback transitions to a different media item.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/MediaItem mediaItem` | The media item. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.MediaItemTransitionReason int reason` | The reason for the media item transition. |

### onMediaMetadataChanged

```
@UnstableApi
default void onMediaMetadataChanged(
    AnalyticsListener.EventTime eventTime,
    MediaMetadata mediaMetadata
)
```

Called when the combined `https://developer.android.com/reference/androidx/media3/common/MediaMetadata` changes.

The provided `https://developer.android.com/reference/androidx/media3/common/MediaMetadata` is a combination of the `https://developer.android.com/reference/androidx/media3/common/MediaItem#mediaMetadata()` and the static and dynamic metadata from the `https://developer.android.com/reference/androidx/media3/exoplayer/trackselection/TrackSelection#getFormat(int)` and `https://developer.android.com/reference/androidx/media3/exoplayer/metadata/MetadataOutput#onMetadata(androidx.media3.common.Metadata)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/MediaMetadata mediaMetadata` | The combined `https://developer.android.com/reference/androidx/media3/common/MediaMetadata`. |

### onMetadata

```
@UnstableApi
default void onMetadata(AnalyticsListener.EventTime eventTime, Metadata metadata)
```

Called when there is `https://developer.android.com/reference/androidx/media3/common/Metadata` associated with the current playback time.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Metadata metadata` | The metadata. |

### onPlayWhenReadyChanged

```
@UnstableApi
default void onPlayWhenReadyChanged(
    AnalyticsListener.EventTime eventTime,
    boolean playWhenReady,
    @Player.PlayWhenReadyChangeReason int reason
)
```

Called when the value changed that indicates whether playback will proceed when ready.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `boolean playWhenReady` | Whether playback will proceed when ready. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.PlayWhenReadyChangeReason int reason` | The `https://developer.android.com/reference/androidx/media3/common/Player.PlayWhenReadyChangeReason` of the change. |

### onPlaybackParametersChanged

```
@UnstableApi
default void onPlaybackParametersChanged(
    AnalyticsListener.EventTime eventTime,
    PlaybackParameters playbackParameters
)
```

Called when the playback parameters changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/PlaybackParameters playbackParameters` | The new playback parameters. |

### onPlaybackStateChanged

```
@UnstableApi
default void onPlaybackStateChanged(
    AnalyticsListener.EventTime eventTime,
    @Player.State int state
)
```

Called when the playback state changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.State int state` | The new `https://developer.android.com/reference/androidx/media3/common/Player.State`. |

### onPlaybackSuppressionReasonChanged

```
@UnstableApi
default void onPlaybackSuppressionReasonChanged(
    AnalyticsListener.EventTime eventTime,
    @Player.PlaybackSuppressionReason int playbackSuppressionReason
)
```

Called when playback suppression reason changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.PlaybackSuppressionReason int playbackSuppressionReason` | The new `https://developer.android.com/reference/androidx/media3/common/Player.PlaybackSuppressionReason`. |

### onPlayerError

```
@UnstableApi
default void onPlayerError(
    AnalyticsListener.EventTime eventTime,
    PlaybackException error
)
```

Called when a fatal player error occurred.

Implementations of `https://developer.android.com/reference/androidx/media3/common/Player` may pass an instance of a subclass of `https://developer.android.com/reference/androidx/media3/common/PlaybackException` to this method in order to include more information about the error.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/PlaybackException error` | The error. |

### onPlayerErrorChanged

```
@UnstableApi
default void onPlayerErrorChanged(
    AnalyticsListener.EventTime eventTime,
    @Nullable PlaybackException error
)
```

Called when the `https://developer.android.com/reference/androidx/media3/common/PlaybackException` returned by `https://developer.android.com/reference/androidx/media3/common/Player#getPlayerError()` changes.

Implementations of Player may pass an instance of a subclass of `https://developer.android.com/reference/androidx/media3/common/PlaybackException` to this method in order to include more information about the error.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/PlaybackException error` | The new error, or null if the error is being cleared. |

### onPlayerReleased

```
@UnstableApi
default void onPlayerReleased(AnalyticsListener.EventTime eventTime)
```

Called when the `https://developer.android.com/reference/androidx/media3/common/Player` is released.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |

### onPlayerStateChanged

```
@UnstableApi
default void [onPlayerStateChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayerStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int))(
    AnalyticsListener.EventTime eventTime,
    boolean playWhenReady,
    @Player.State int playbackState
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlaybackStateChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int)` and `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPlayWhenReadyChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,boolean,int)` instead.

### onPlaylistMetadataChanged

```
@UnstableApi
default void onPlaylistMetadataChanged(
    AnalyticsListener.EventTime eventTime,
    MediaMetadata playlistMetadata
)
```

Called when the playlist `https://developer.android.com/reference/androidx/media3/common/MediaMetadata` changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/MediaMetadata playlistMetadata` | The playlist `https://developer.android.com/reference/androidx/media3/common/MediaMetadata`. |

### onPositionDiscontinuity

```
@UnstableApi
default void [onPositionDiscontinuity](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int))(
    AnalyticsListener.EventTime eventTime,
    @Player.DiscontinuityReason int reason
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)` instead.

### onPositionDiscontinuity

```
@UnstableApi
default void onPositionDiscontinuity(
    AnalyticsListener.EventTime eventTime,
    Player.PositionInfo oldPosition,
    Player.PositionInfo newPosition,
    @Player.DiscontinuityReason int reason
)
```

Called when a position discontinuity occurred.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Player.PositionInfo oldPosition` | The position before the discontinuity. |
| `https://developer.android.com/reference/androidx/media3/common/Player.PositionInfo newPosition` | The position after the discontinuity. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.DiscontinuityReason int reason` | The reason for the position discontinuity. |

### onRenderedFirstFrame

```
@UnstableApi
default void onRenderedFirstFrame(
    AnalyticsListener.EventTime eventTime,
    Object output,
    long renderTimeMs
)
```

Called when a frame is rendered for the first time since setting the surface, or since the renderer was reset, or since the stream being rendered was changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/Object.html output` | The output to which a frame has been rendered. Normally a `https://developer.android.com/reference/android/view/Surface.html`, however may also be other output types (e.g., a `https://developer.android.com/reference/androidx/media3/exoplayer/video/VideoDecoderOutputBufferRenderer`). |
| `long renderTimeMs` | `https://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()` when the first frame was rendered. |

### onRendererReadyChanged

```
@UnstableApi
default void onRendererReadyChanged(
    AnalyticsListener.EventTime eventTime,
    int rendererIndex,
    @C.TrackType int rendererTrackType,
    boolean isRendererReady
)
```

Called each time a renderer starts or stops allowing playback to be ready.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int rendererIndex` | The index of the renderer in the `https://developer.android.com/reference/androidx/media3/exoplayer/ExoPlayer` instance. |
| `@https://developer.android.com/reference/androidx/media3/common/C.TrackType int rendererTrackType` | The `https://developer.android.com/reference/androidx/media3/common/C.TrackType` of the renderer. |
| `boolean isRendererReady` | Whether the renderer allows playback to be ready. |

### onRepeatModeChanged

```
@UnstableApi
default void onRepeatModeChanged(
    AnalyticsListener.EventTime eventTime,
    @Player.RepeatMode int repeatMode
)
```

Called when the repeat mode changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.RepeatMode int repeatMode` | The new repeat mode. |

### onSeekBackIncrementChanged

```
@UnstableApi
default void onSeekBackIncrementChanged(
    AnalyticsListener.EventTime eventTime,
    long seekBackIncrementMs
)
```

Called when the seek back increment changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `long seekBackIncrementMs` | The seek back increment, in milliseconds. |

### onSeekForwardIncrementChanged

```
@UnstableApi
default void onSeekForwardIncrementChanged(
    AnalyticsListener.EventTime eventTime,
    long seekForwardIncrementMs
)
```

Called when the seek forward increment changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `long seekForwardIncrementMs` | The seek forward increment, in milliseconds. |

### onSeekStarted

```
@UnstableApi
default void [onSeekStarted](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onSeekStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime))(AnalyticsListener.EventTime eventTime)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onPositionDiscontinuity(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.Player.PositionInfo,androidx.media3.common.Player.PositionInfo,int)` instead, listening to changes with `https://developer.android.com/reference/androidx/media3/common/Player#DISCONTINUITY_REASON_SEEK()`.

### onShuffleModeChanged

```
@UnstableApi
default void onShuffleModeChanged(
    AnalyticsListener.EventTime eventTime,
    boolean shuffleModeEnabled
)
```

Called when the shuffle mode changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `boolean shuffleModeEnabled` | Whether the shuffle mode is enabled. |

### onSkipSilenceEnabledChanged

```
@UnstableApi
default void onSkipSilenceEnabledChanged(
    AnalyticsListener.EventTime eventTime,
    boolean skipSilenceEnabled
)
```

Called when skipping silences is enabled or disabled in the audio stream.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `boolean skipSilenceEnabled` | Whether skipping silences in the audio stream is enabled. |

### onSurfaceSizeChanged

```
@UnstableApi
default void onSurfaceSizeChanged(
    AnalyticsListener.EventTime eventTime,
    int width,
    int height
)
```

Called when the output surface size changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `int width` | The surface width in pixels. May be `https://developer.android.com/reference/androidx/media3/common/C#LENGTH_UNSET()` if unknown, or 0 if the video is not rendered onto a surface. |
| `int height` | The surface height in pixels. May be `https://developer.android.com/reference/androidx/media3/common/C#LENGTH_UNSET()` if unknown, or 0 if the video is not rendered onto a surface. |

### onTimelineChanged

```
@UnstableApi
default void onTimelineChanged(
    AnalyticsListener.EventTime eventTime,
    @Player.TimelineChangeReason int reason
)
```

Called when the timeline changed.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `@https://developer.android.com/reference/androidx/media3/common/Player.TimelineChangeReason int reason` | The reason for the timeline change. |

### onTrackSelectionParametersChanged

```
@UnstableApi
default void onTrackSelectionParametersChanged(
    AnalyticsListener.EventTime eventTime,
    TrackSelectionParameters trackSelectionParameters
)
```

Called when track selection parameters change.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/TrackSelectionParameters trackSelectionParameters` | The new `https://developer.android.com/reference/androidx/media3/common/TrackSelectionParameters`. |

### onTracksChanged

```
@UnstableApi
default void onTracksChanged(AnalyticsListener.EventTime eventTime, Tracks tracks)
```

Called when the tracks change.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Tracks tracks` | The tracks. Never null, but may be of length zero. |

### onUpstreamDiscarded

```
@UnstableApi
default void onUpstreamDiscarded(
    AnalyticsListener.EventTime eventTime,
    MediaLoadData mediaLoadData
)
```

Called when data is removed from the back of a media buffer, typically so that it can be re-buffered in a different format.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData mediaLoadData` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaLoadData` defining the media being discarded. |

### onVideoCodecError

```
@UnstableApi
default void onVideoCodecError(
    AnalyticsListener.EventTime eventTime,
    Exception videoCodecError
)
```

Called when a video decoder encounters an error.

This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should *not* implement this method to display a user visible error or initiate an application level retry. `https://developer.android.com/reference/androidx/media3/common/Player.Listener#onPlayerError(androidx.media3.common.PlaybackException)` is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/Exception.html videoCodecError` | The error. Typically a `https://developer.android.com/reference/android/media/MediaCodec.CodecException.html` if the renderer uses `https://developer.android.com/reference/android/media/MediaCodec.html`, or a `https://developer.android.com/reference/androidx/media3/decoder/DecoderException` if the renderer uses a software decoder. |

### onVideoDecoderInitialized

```
@UnstableApi
default void [onVideoDecoderInitialized](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long))(
    AnalyticsListener.EventTime eventTime,
    String decoderName,
    long initializationDurationMs
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Use `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoDecoderInitialized(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)`.

### onVideoDecoderInitialized

```
@UnstableApi
default void onVideoDecoderInitialized(
    AnalyticsListener.EventTime eventTime,
    String decoderName,
    long initializedTimestampMs,
    long initializationDurationMs
)
```

Called when a video renderer creates a decoder.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/String.html decoderName` | The decoder that was created. |
| `long initializedTimestampMs` | `https://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()` when initialization finished. |
| `long initializationDurationMs` | The time taken to initialize the decoder in milliseconds. |

### onVideoDecoderReleased

```
@UnstableApi
default void onVideoDecoderReleased(
    AnalyticsListener.EventTime eventTime,
    String decoderName
)
```

Called when a video renderer releases a decoder.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/java/lang/String.html decoderName` | The decoder that was released. |

### onVideoDisabled

```
@UnstableApi
default void onVideoDisabled(
    AnalyticsListener.EventTime eventTime,
    DecoderCounters decoderCounters
)
```

Called when a video renderer is disabled.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters` | `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters` that were updated by the renderer. |

### onVideoEnabled

```
@UnstableApi
default void onVideoEnabled(
    AnalyticsListener.EventTime eventTime,
    DecoderCounters decoderCounters
)
```

Called when a video renderer is enabled.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters decoderCounters` | `https://developer.android.com/reference/androidx/media3/exoplayer/DecoderCounters` that will be updated by the renderer for as long as it remains enabled. |

### onVideoFrameProcessingOffset

```
@UnstableApi
default void onVideoFrameProcessingOffset(
    AnalyticsListener.EventTime eventTime,
    long totalProcessingOffsetUs,
    int frameCount
)
```

Called when there is an update to the video frame processing offset reported by a video renderer.

The processing offset for a video frame is the difference between the time at which the frame became available to render, and the time at which it was scheduled to be rendered. A positive value indicates the frame became available early enough, whereas a negative value indicates that the frame wasn't available until after the time at which it should have been rendered.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `long totalProcessingOffsetUs` | The sum of the video frame processing offsets for frames rendered since the last call to this method. |
| `int frameCount` | The number to samples included in `totalProcessingOffsetUs`. |

### onVideoInputFormatChanged

```
@UnstableApi
default void onVideoInputFormatChanged(
    AnalyticsListener.EventTime eventTime,
    Format format,
    @Nullable DecoderReuseEvaluation decoderReuseEvaluation
)
```

Called when the format of the media being consumed by a video renderer changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/Format format` | The new format. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/DecoderReuseEvaluation decoderReuseEvaluation` | The result of the evaluation to determine whether an existing decoder instance can be reused for the new format, or `null` if the renderer did not have a decoder. |

### onVideoSizeChanged

```
@UnstableApi
default void onVideoSizeChanged(
    AnalyticsListener.EventTime eventTime,
    VideoSize videoSize
)
```

Called before a frame is rendered for the first time since setting the surface, and each time there's a change in the size or pixel aspect ratio of the video being rendered.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `https://developer.android.com/reference/androidx/media3/common/VideoSize videoSize` | The new size of the video. |

### onVideoSizeChanged

```
@UnstableApi
default void [onVideoSizeChanged](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,int,int,int,float))(
    AnalyticsListener.EventTime eventTime,
    int width,
    int height,
    int unappliedRotationDegrees,
    float pixelWidthHeightRatio
)
```

> [!CAUTION]
> **This method is deprecated.**   
>
> Implement `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener#onVideoSizeChanged(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,androidx.media3.common.VideoSize)` instead.

### onVolumeChanged

```
@UnstableApi
default void onVolumeChanged(AnalyticsListener.EventTime eventTime, float volume)
```

Called when the volume changes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The event time. |
| `float volume` | The new volume, with 0 being silence and 1 being unity gain. |