androidx / androidx/media

androidx.media3.common.util.Assertions.checkState(Assertions.java:85)

Open
#2,877 2 comments 0 reactions 1 assignee View on GitHub

@marcbaechinger is already working on this.

Since Nov 4, 2025.

bug needs triage
Dominant language
Java
Stars
3k
Forks
955
Avg merge
12d 14h
Merged PRs (30d)
2

Description

Version

Media3 1.4.0

More version details

api("androidx.media3:media3-exoplayer:1.4.0")
api("androidx.media3:media3-session:1.4.0")
api("androidx.media3:media3-common:1.4.0")

Devices that reproduce the issue

Customized in-vehicle infotainment system, using Android 13.

Devices that do not reproduce the issue

No response

Reproducible in the demo app?

No

Reproduction steps

1.My multimedia application uses exoPlayer internally, and there's a requirement to switch the player when changing audio sources. Therefore, I'm binding a player to the MediaLibrarySession using: MediaLibrarySession.Builder(this, switchablePlayer, this). The problem tends to occur when the internal audio source switches from Bluetooth to USB
update list to exoPlayer:

override fun onUsbPlaylistChanged(playlist: List<MediaItem>) {
    MediaLog.i(TAG, " onUsbPlaylistChanged playlist ${playlist.size}")
    currentMediaList.clear()
    currentMediaList.addAll(playlist)
    exoPlayer?.clearMediaItems()
    exoPlayer?.addMediaItems(currentMediaList)
}

2.when I need Play ,changing the internal player accordingly

fun switchPlayer(newSmartPlayer: SmartPlayer?) {
    MediaLog.d(TAG, "Switching player: ${currentSmartPlayer?.javaClass?.simpleName} → ${newSmartPlayer?.javaClass?.simpleName}")
    currentPlayer?.removeListener(forwardingListener)
    currentSmartPlayer = newSmartPlayer
    currentPlayer = newSmartPlayer?.getPlayer()
    currentPlayer?.addListener(forwardingListener)
    MediaLog.d(TAG, "Player switched, listeners: ${listeners.size}")
    currentPlayer?.currentMediaItem?.let { item ->
        mediaItemChangeCallback?.onMediaItemDataChange(item)
    }
}

3.This player switching is done within SwitchablePlayer.

I will call the play logic.

override fun playMediaByItem(mediaItem: MediaItem) {
    MediaLog.d(TAG, "playMediaByItem: ${mediaItem.mediaMetadata.title}")
    MediaLog.d(TAG, "playMediaByItem: ${mediaItem.mediaId}")
    val index = findMediaIndex(mediaItem)
    if (index >= 0) {
        playMediaAtIndex(index)
    } else {
        MediaLog.w(TAG, "Media not found in playlist: ${mediaItem.mediaId}")
    }
}

private fun playMediaAtIndex(index: Int) {
    if (index >= 0 && index < currentMediaList.size) {
        exoPlayer?.seekToDefaultPosition(index)
        exoPlayer?.prepare()
        exoPlayer?.play()
        MediaLog.d(TAG, "Playing media at index: $index")
    } else {
        MediaLog.w(TAG, "Invalid index: $index, playlist size: ${currentMediaList.size}")
    }
}
Expected result

The usb music media play successfully

Actual result
Playback crashes with the following stack trace
11-03 19:11:19.734  3824  3824 E AndroidRuntime: Process: com.smartlink.multimedia, PID: 3824
11-03 19:11:19.734  3824  3824 E AndroidRuntime: java.lang.IllegalStateException
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.common.util.Assertions.checkState(Assertions.java:85)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.PlayerInfo$Builder.build(PlayerInfo.java:381)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.PlayerInfo.copyWithTimeline(PlayerInfo.java:597)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaUtils.mergePlayerInfo(MediaUtils.java:149)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaControllerImplBase.onPlayerInfoChanged(MediaControllerImplBase.java:2715)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaControllerStub.lambda$onPlayerInfoChangedWithExclusions$9(MediaControllerStub.java:258)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaControllerStub$$ExternalSyntheticLambda13.run(Unknown Source:4)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaControllerStub.lambda$dispatchControllerTaskOnHandler$14(MediaControllerStub.java:374)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at androidx.media3.session.MediaControllerStub$$ExternalSyntheticLambda6.run(Unknown Source:4)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:942)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:201)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at android.os.Looper.loop(Looper.java:288)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8061)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:703)
11-03 19:11:19.734  3824  3824 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)ra
Media

I will send you the relevant demo via email

Bug Report
  • You will email the zip file produced by adb bugreport to android-media-github@google.com after filing this issue.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.