google/ExoPlayer · error · IllegalStateException
CallbackMediaItem isn't supported
Error message
CallbackMediaItem isn't supported
What it means
DefaultMediaItemConverter.convertToExoPlayerMediaItem rejects androidx.media2 CallbackMediaItem instances with IllegalStateException. CallbackMediaItem supplies data through a DataSourceCallback rather than a URI; the ExoPlayer bridge has no way to represent an arbitrary callback as a MediaItem, so it refuses the conversion.
Source
Thrown at extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java:53
*
* <p>Note that {@link #getMetadata} can be overridden to fill in additional metadata when
* converting {@link MediaItem ExoPlayer MediaItems} to their AndroidX equivalents.
*
* @deprecated com.google.android.exoplayer2 is deprecated. Please migrate to androidx.media3 (which
* contains the same ExoPlayer code). See <a
* href="https://developer.android.com/guide/topics/media/media3/getting-started/migration-guide">the
* migration guide</a> for more details, including a script to help with the migration.
*/
@Deprecated
public class DefaultMediaItemConverter implements MediaItemConverter {
@Override
public MediaItem convertToExoPlayerMediaItem(androidx.media2.common.MediaItem media2MediaItem) {
if (media2MediaItem instanceof FileMediaItem) {
throw new IllegalStateException("FileMediaItem isn't supported");
}
if (media2MediaItem instanceof CallbackMediaItem) {
throw new IllegalStateException("CallbackMediaItem isn't supported");
}
@Nullable Uri uri = null;
@Nullable String mediaId = null;
@Nullable String title = null;
if (media2MediaItem instanceof UriMediaItem) {
UriMediaItem uriMediaItem = (UriMediaItem) media2MediaItem;
uri = uriMediaItem.getUri();
}
@Nullable androidx.media2.common.MediaMetadata metadata = media2MediaItem.getMetadata();
if (metadata != null) {
@Nullable String uriString = metadata.getString(METADATA_KEY_MEDIA_URI);
mediaId = metadata.getString(METADATA_KEY_MEDIA_ID);
if (uri == null) {
if (uriString != null) {
uri = Uri.parse(uriString);
} else if (mediaId != null) {
uri = Uri.parse("media2:///" + mediaId);View on GitHub (pinned to dd430f7053)
Solutions
- Migrate to ExoPlayer/Media3 directly: implement a custom ExoPlayer DataSource (or use MediaItem.Builder with a custom Resolver/DataSource in Media3) instead of CallbackMediaItem.
- If staying on media2 short-term, convert the callback into a URI-addressable source (local file or content:// provider) and use UriMediaItem.
- Write a custom MediaItemConverter that maps CallbackMediaItem to a MediaItem backed by a custom DataSource registered on the player.
Example fix
// before
androidx.media2.common.MediaItem item =
new CallbackMediaItem.Builder().setDataSourceCallback(callback).build(); // IllegalStateException
// after
// Register a custom DataSource for the scheme instead:
MediaItem exoItem = MediaItem.fromUri("callback://mydata");
// and build the player with a DataSource.Factory that handles "callback://" Defensive patterns
Strategy: type-guard
Validate before calling
if (media2Item instanceof CallbackMediaItem) { /* back with custom DataSource instead */ } Type guard
static boolean isConvertible(androidx.media2.common.MediaItem item) {
return item instanceof UriMediaItem;
} Prevention
- Convert callback-based content to URI-addressable sources (content:// provider or local file).
- Plan migration to Media3 where custom DataSources replace DataSourceCallback cleanly.
When it happens
Trigger: Passing a media2 androidx.media2.common.CallbackMediaItem (built with CallbackMediaItem.Builder.setDataSourceCallback(...)) through any media2-to-ExoPlayer conversion path backed by DefaultMediaItemConverter — e.g. a media2 SessionPlayer implementation delegating to ExoPlayer.
Common situations: Apps feeding encrypted or in-memory content via DataSourceCallback in media2 and then handing the item to an ExoPlayer-backed session; migration projects assuming all media2 item flavors convert; library code that accepts generic media2 MediaItem without checking the subtype.
Related errors
AI-assisted analysis of google/ExoPlayer@dd430f7053 (2026-08-14).
Data as JSON: /api/errors/54fddf1757ebbb13.
Report an issue: GitHub.