# MediaMetricsListener

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/MediaMetricsListener.java+class:androidx.media3.exoplayer.analytics.MediaMetricsListener)

*** ** * ** ***


```
@UnstableApi
@RequiresApi(value = 31)
public final class MediaMetricsListener implements AnalyticsListener, PlaybackSessionManager.Listener
```

<br />

*** ** * ** ***

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`.

It listens to playback events and forwards them to a `https://developer.android.com/reference/android/media/metrics/PlaybackSession.html`. The `https://developer.android.com/reference/android/media/metrics/LogSessionId.html` of the playback session can be obtained with `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#getLogSessionId()`.

## Summary

| ### Public methods |
|---|---|
| `static @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#create(android.content.Context)(https://developer.android.com/reference/android/content/Context.html context)` Creates a media metrics listener. |
| `https://developer.android.com/reference/android/media/metrics/LogSessionId.html` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#getLogSessionId()()` Returns the `https://developer.android.com/reference/android/media/metrics/LogSessionId.html` used by this listener. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#onAdPlaybackStarted(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html contentSessionId, https://developer.android.com/reference/java/lang/String.html adSessionId )` Called when a session is interrupted by ad playback. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#onSessionActive(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 sessionId )` Called when a session becomes active, i.e. playing in the foreground. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#onSessionCreated(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 sessionId )` Called when a new session is created as a result of `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlaybackSessionManager#updateSessions(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)`. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#onSessionFinished(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)( https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime, https://developer.android.com/reference/java/lang/String.html sessionId, boolean automaticTransitionToNextPlayback )` Called when a session is permanently finished. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |
| `void` | `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener#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. |

| ### Inherited Constants |
|---|
| From [androidx.media3.exoplayer.analytics.AnalyticsListener](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener) |---|---| | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | |

| ### Inherited methods |
|---|
| From [androidx.media3.exoplayer.analytics.AnalyticsListener](https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener) |---|---| | `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. | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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`. | | `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 /> | | `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 | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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)`. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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 /> | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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 /> | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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. | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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. | | `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 /> | | `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. | | `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. | | `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. | | `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. | | `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. | | `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 /> | | `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. | |

## Public methods

### create

```
public static @Nullable MediaMetricsListener create(Context context)
```

Creates a media metrics listener.

| Parameters |
|---|---|
| `https://developer.android.com/reference/android/content/Context.html context` | A context. |

| Returns |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/MediaMetricsListener`, or null if the `https://developer.android.com/reference/android/content/Context.html#MEDIA_METRICS_SERVICE` isn't available. |

### getLogSessionId

```
public LogSessionId getLogSessionId()
```

Returns the `https://developer.android.com/reference/android/media/metrics/LogSessionId.html` used by this listener.

### onAdPlaybackStarted

```
public void onAdPlaybackStarted(
    AnalyticsListener.EventTime eventTime,
    String contentSessionId,
    String adSessionId
)
```

Called when a session is interrupted by ad playback.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` at which the ad playback starts. |
| `https://developer.android.com/reference/java/lang/String.html contentSessionId` | The session identifier of the content session. |
| `https://developer.android.com/reference/java/lang/String.html adSessionId` | The identifier of the ad session. |

### onBandwidthEstimate

```
public 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. |

### onDownstreamFormatChanged

```
public 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. |

### onEvents

```
public 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. |

### onLoadError

```
public 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. |

### onPlayerError

```
public 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. |

### onPositionDiscontinuity

```
public 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. |

### onSessionActive

```
public void onSessionActive(
    AnalyticsListener.EventTime eventTime,
    String sessionId
)
```

Called when a session becomes active, i.e. playing in the foreground.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` at which the session becomes active. |
| `https://developer.android.com/reference/java/lang/String.html sessionId` | The identifier of the session. |

### onSessionCreated

```
public void onSessionCreated(
    AnalyticsListener.EventTime eventTime,
    String sessionId
)
```

Called when a new session is created as a result of `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/PlaybackSessionManager#updateSessions(androidx.media3.exoplayer.analytics.AnalyticsListener.EventTime)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` at which the session is created. |
| `https://developer.android.com/reference/java/lang/String.html sessionId` | The identifier of the new session. |

### onSessionFinished

```
public void onSessionFinished(
    AnalyticsListener.EventTime eventTime,
    String sessionId,
    boolean automaticTransitionToNextPlayback
)
```

Called when a session is permanently finished.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime eventTime` | The `https://developer.android.com/reference/androidx/media3/exoplayer/analytics/AnalyticsListener.EventTime` at which the session finished. |
| `https://developer.android.com/reference/java/lang/String.html sessionId` | The identifier of the finished session. |
| `boolean automaticTransitionToNextPlayback` | Whether the session finished because of an automatic transition to the next playback item. |

### onVideoDisabled

```
public 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. |

### onVideoSizeChanged

```
public 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. |