Playback will not stop if multiple exceptions occur in the playingPeriodHolder.prepared state
When I play an online MP4 video, I get an exception:
java.io.EOFException
at androidx.media3.exoplayer.source.SampleDataQueue.sampleData(SampleDataQueue.java:186)
at androidx.media3.exoplayer.source.SampleQueue.sampleData(SampleQueue.java:635)
at androidx.media3.extractor.TrackOutput.sampleData(TrackOutput.java:168)
at androidx.media3.extractor.mp4.Mp4Extractor.readSample(Mp4Extractor.java:961)
at androidx.media3.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:410)
at androidx.media3.exoplayer.source.BundledExtractorsAdapter.read(BundledExtractorsAdapter.java:147)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1146)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
at java.lang.Thread.run(Thread.java:1012)
When I turn off autoplay in EXO, the above exception recurs, consuming my phone's network data. Is there a way to destroy EXO without playing the video or prevent network requests when an exception occurs?
This issue frequently occurs with the following online MP4 video links: https://www.maersk.com.cn/~/media_sc9/maersk/homepage/videos/all-the-way_16x9_SUBS_ENG.mp4
Hi @WitchReimu,
Is it reproducible on demo app? I used your video link and played on demo app, the player did do some retries after the first exception, and then surfaced the playback failure and finally end up in the IDLE state (no more network requests from then since the player didn't load anymore).
2025-10-15 11:53:29.958 27951-27951 EventLogger androidx.media3.demo.main D state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]
2025-10-15 11:53:29.974 27951-27951 EventLogger androidx.media3.demo.main D surfaceSize [eventTime=0.02, mediaPos=0.00, window=0, w=1440, h=2891]
2025-10-15 11:53:29.982 27951-27951 EventLogger androidx.media3.demo.main D audioSessionId [eventTime=0.03, mediaPos=0.00, window=0, 12321]
2025-10-15 11:53:29.983 27951-27951 EventLogger androidx.media3.demo.main D loading [eventTime=0.03, mediaPos=0.00, window=0, period=0, true]
2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D timeline [eventTime=0.03, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D period [?]
2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D window [?, seekable=false, dynamic=false]
2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D ]
2025-10-15 11:53:32.012 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=2.06, mediaPos=0.00, window=0, period=0, loadError
androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476)
at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275)
at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615)
at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45)
at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104)
at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65)
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924)
... 3 more
Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805)
]
2025-10-15 11:53:33.409 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=3.45, mediaPos=0.00, window=0, period=0, loadError
androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476)
at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275)
at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615)
at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45)
at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104)
at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65)
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924)
... 3 more
Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805)
]
2025-10-15 11:53:35.877 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=5.92, mediaPos=0.00, window=0, period=0, loadError
androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476)
at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275)
at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615)
at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45)
at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104)
at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65)
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924)
... 3 more
Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805)
]
2025-10-15 11:53:39.666 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=9.71, mediaPos=0.00, window=0, period=0, loadError
androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476)
at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275)
at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615)
at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45)
at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104)
at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65)
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924)
... 3 more
Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805)
]
2025-10-15 11:53:39.689 27951-27951 EventLogger androidx.media3.demo.main E playerFailed [eventTime=9.73, mediaPos=0.00, window=0, period=0, errorCode=ERROR_CODE_IO_NETWORK_CONNECTION_FAILED
androidx.media3.exoplayer.ExoPlaybackException: Source error
at androidx.media3.exoplayer.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:927)
at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:899)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.dispatchMessage(Looper.java:315)
at android.os.Looper.loopOnce(Looper.java:251)
at android.os.Looper.loop(Looper.java:349)
at android.os.HandlerThread.run(HandlerThread.java:100)
Caused by: androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476)
at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275)
at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802)
at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615)
at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88)
at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109)
at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
at java.lang.Thread.run(Thread.java:1119)
Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45)
at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104)
at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65)
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924)
... 3 more
Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false
at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805)
]
2025-10-15 11:53:39.690 27951-27951 EventLogger androidx.media3.demo.main D loading [eventTime=9.74, mediaPos=0.00, window=0, period=0, false]
2025-10-15 11:53:39.692 27951-27951 EventLogger androidx.media3.demo.main D state [eventTime=9.74, mediaPos=0.00, window=0, period=0, IDLE]
Or do you want a different error handling behaviour? We use DefaultLoadErrorHandlingPolicy, but you can do the customization at different levels.
For the simplest customization, you can specify your desired retry count when initializing the DefaultLoadErrorHandlingPolicy:
https://github.com/androidx/media/blob/bfe5930f7f29c6492d60e3d01a90abd3c138b615/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java#L76-L78
or extend this class to set the custom retry delay logic. For a more complex case, you can even implement your own LoadErrorHandlingPolicy. With all of these cases, you will need to set the customized DefaultLoadErrorHandlingPolicy or your own LoadErrorHandlingPolicy to MediaSource.Factory, and set that MediaSource.Factory via ExoPlayer.Builder.
Yes, it happens in the demo app. I didn't express it clearly. You need to make the following changes in PlayerActivity。
protected boolean initializePlayer() {
Intent intent = getIntent();
if (player == null) {
mediaItems = createMediaItems(intent);
if (mediaItems.isEmpty()) {
return false;
}
lastSeenTracks = Tracks.EMPTY;
ExoPlayer.Builder playerBuilder =
new ExoPlayer.Builder(/* context= */ this)
.setMediaSourceFactory(createMediaSourceFactory());
setRenderersFactory(
playerBuilder, intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false));
player = playerBuilder.build();
player.setTrackSelectionParameters(trackSelectionParameters);
player.addListener(new PlayerEventListener());
player.addAnalyticsListener(new EventLogger());
player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true);
//-----------------------------------Make changes here. Originally it was true.-----------------------------------------------------------
player.setPlayWhenReady(false);
playerView.setPlayer(player);
configurePlayerWithServerSideAdsLoader();
debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start();
}
Hi @WitchReimu,
Is it reproducible on demo app? I used your video link and played on demo app, the player did do some retries after the first exception, and then surfaced the playback failure and finally end up in the IDLE state (no more network requests from then since the player didn't load anymore).
2025-10-15 11:53:29.958 27951-27951 EventLogger androidx.media3.demo.main D state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING] 2025-10-15 11:53:29.974 27951-27951 EventLogger androidx.media3.demo.main D surfaceSize [eventTime=0.02, mediaPos=0.00, window=0, w=1440, h=2891] 2025-10-15 11:53:29.982 27951-27951 EventLogger androidx.media3.demo.main D audioSessionId [eventTime=0.03, mediaPos=0.00, window=0, 12321] 2025-10-15 11:53:29.983 27951-27951 EventLogger androidx.media3.demo.main D loading [eventTime=0.03, mediaPos=0.00, window=0, period=0, true] 2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D timeline [eventTime=0.03, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE 2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D period [?] 2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D window [?, seekable=false, dynamic=false] 2025-10-15 11:53:29.984 27951-27951 EventLogger androidx.media3.demo.main D ] 2025-10-15 11:53:32.012 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=2.06, mediaPos=0.00, window=0, period=0, loadError androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476) at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275) at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615) at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88) at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109) at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45) at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104) at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65) at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924) ... 3 more Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805) ] 2025-10-15 11:53:33.409 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=3.45, mediaPos=0.00, window=0, period=0, loadError androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476) at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275) at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615) at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88) at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109) at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45) at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104) at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65) at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924) ... 3 more Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805) ] 2025-10-15 11:53:35.877 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=5.92, mediaPos=0.00, window=0, period=0, loadError androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476) at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275) at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615) at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88) at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109) at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45) at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104) at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65) at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924) ... 3 more Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805) ] 2025-10-15 11:53:39.666 27951-27951 EventLogger androidx.media3.demo.main E internalError [eventTime=9.71, mediaPos=0.00, window=0, period=0, loadError androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476) at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275) at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615) at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88) at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109) at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45) at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104) at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65) at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924) ... 3 more Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805) ] 2025-10-15 11:53:39.689 27951-27951 EventLogger androidx.media3.demo.main E playerFailed [eventTime=9.73, mediaPos=0.00, window=0, period=0, errorCode=ERROR_CODE_IO_NETWORK_CONNECTION_FAILED androidx.media3.exoplayer.ExoPlaybackException: Source error at androidx.media3.exoplayer.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:927) at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:899) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.dispatchMessage(Looper.java:315) at android.os.Looper.loopOnce(Looper.java:251) at android.os.Looper.loop(Looper.java:349) at android.os.HandlerThread.run(HandlerThread.java:100) Caused by: androidx.media3.datasource.HttpEngineDataSource$OpenException: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at androidx.media3.datasource.HttpEngineDataSource.open(HttpEngineDataSource.java:476) at androidx.media3.datasource.DefaultDataSource.open(DefaultDataSource.java:275) at androidx.media3.datasource.cache.CacheDataSource.openNextSource(CacheDataSource.java:802) at androidx.media3.datasource.cache.CacheDataSource.open(CacheDataSource.java:615) at androidx.media3.datasource.StatsDataSource.open(StatsDataSource.java:88) at androidx.media3.exoplayer.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1109) at androidx.media3.exoplayer.upstream.Loader$LoadTask.run(Loader.java:453) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at java.lang.Thread.run(Thread.java:1119) Caused by: android.net.http.NetworkExceptionWrapper: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.http.CronetExceptionTranslationUtils.translateException(CronetExceptionTranslationUtils.java:45) at android.net.http.UrlRequestCallbackWrapper.onFailed(UrlRequestCallbackWrapper.java:104) at android.net.connectivity.org.chromium.net.impl.VersionSafeCallbacks$UrlRequestCallback.onFailed(VersionSafeCallbacks.java:65) at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest$8.run(CronetUrlRequest.java:924) ... 3 more Caused by: android.net.connectivity.org.chromium.net.impl.NetworkExceptionImpl: Exception in CronetUrlRequest: net::ERR_HTTP2_PROTOCOL_ERROR, ErrorCode=11, InternalErrorCode=-337, Retryable=false at android.net.connectivity.org.chromium.net.impl.CronetUrlRequest.onError(CronetUrlRequest.java:805) ] 2025-10-15 11:53:39.690 27951-27951 EventLogger androidx.media3.demo.main D loading [eventTime=9.74, mediaPos=0.00, window=0, period=0, false] 2025-10-15 11:53:39.692 27951-27951 EventLogger androidx.media3.demo.main D state [eventTime=9.74, mediaPos=0.00, window=0, period=0, IDLE]Or do you want a different error handling behaviour? We use
DefaultLoadErrorHandlingPolicy, but you can do the customization at different levels.For the simplest customization, you can specify your desired retry count when initializing the
DefaultLoadErrorHandlingPolicy:Lines 76 to 78 in bfe5930
public DefaultLoadErrorHandlingPolicy(int minimumLoadableRetryCount) { this.minimumLoadableRetryCount = minimumLoadableRetryCount; } or extend this class to set the custom retry delay logic. For a more complex case, you can even implement your own
LoadErrorHandlingPolicy. With all of these cases, you will need to set the customizedDefaultLoadErrorHandlingPolicyor your ownLoadErrorHandlingPolicytoMediaSource.Factory, and set thatMediaSource.FactoryviaExoPlayer.Builder.
I tried to modify the number of retries of DefaultLoadErrorHandlingPolicy during initialization, but it did not achieve the expected effect when autoplay is turned off.
Hi @WitchReimu,
Sorry, I just realized that I've made a mistake in my last comment. In my last repro, the error I got is a network exception from HttpEngineDataSource, which is different than your exception and then maybe handled by different code paths. However, when I used CronetDataSource, the network exception wouldn't happen, but I couldn't reproduce your scenario neither (with autoplay OFF), it kept loading without playing until the buffer was full.
Could you please share what device and OS version you were reproducing with?
(It also worth to look at why HttpEngineDataSource has issue with open the connection and CronetDataSource doesn't, but it is another problem than what is asked in this issue)
Hi @WitchReimu,
Sorry, I just realized that I've made a mistake in my last comment. In my last repro, the error I got is a network exception from
HttpEngineDataSource, which is different than your exception and then maybe handled by different code paths. However, when I usedCronetDataSource, the network exception wouldn't happen, but I couldn't reproduce your scenario neither (with autoplay OFF), it kept loading without playing until the buffer was full.Could you please share what device and OS version you were reproducing with?
(It also worth to look at why
HttpEngineDataSourcehas issue with open the connection andCronetDataSourcedoesn't, but it is another problem than what is asked in this issue)
devcie info
- hongmi K50
- MIUI Version 13.0.24
- Android Version 12
Did you call the method setPlayWhenReady(playWhenReady:Boolean) in PlayerActivity and set it to false?
This problem is probabilistic and not guaranteed to occur.