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

  1. Migrate to ExoPlayer/Media3 directly: implement a custom ExoPlayer DataSource (or use MediaItem.Builder with a custom Resolver/DataSource in Media3) instead of CallbackMediaItem.
  2. If staying on media2 short-term, convert the callback into a URI-addressable source (local file or content:// provider) and use UriMediaItem.
  3. 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

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.