diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4a42639c84..72ca26c6b7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -9,6 +9,7 @@ * Updated default max buffer length in `DefaultLoadControl`. * Added `AnalyticsListener` interface which can be registered in `SimpleExoPlayer` to receive detailed meta data for each ExoPlayer event. +* Added `getPlaybackError` to `Player` interface. * UI components: * Add support for listening to `AspectRatioFrameLayout`'s aspect ratio update ([#3736](https://github.com/google/ExoPlayer/issues/3736)). diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 7e0753ba10..68226fdcf4 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -307,6 +307,11 @@ public final class CastPlayer implements Player { return playbackState; } + @Override + public Exception getPlaybackError() { + return null; + } + @Override public void setPlayWhenReady(boolean playWhenReady) { if (remoteMediaClient == null) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 39a6243933..6d8dd5b7a8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -185,6 +185,10 @@ public interface ExoPlayer extends Player { */ Looper getPlaybackLooper(); + @Override + @Nullable + ExoPlaybackException getPlaybackError(); + /** * Prepares the player to play the provided {@link MediaSource}. Equivalent to * {@code prepare(mediaSource, true, true)}. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index daabbd5a72..5ca5994b6e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -61,6 +61,7 @@ import java.util.concurrent.CopyOnWriteArraySet; private boolean hasPendingPrepare; private boolean hasPendingSeek; private PlaybackParameters playbackParameters; + private @Nullable ExoPlaybackException playbackError; // Playback information when there is no pending seek/set source operation. private PlaybackInfo playbackInfo; @@ -156,6 +157,11 @@ import java.util.concurrent.CopyOnWriteArraySet; return playbackInfo.playbackState; } + @Override + public @Nullable ExoPlaybackException getPlaybackError() { + return playbackError; + } + @Override public void prepare(MediaSource mediaSource) { prepare(mediaSource, true, true); @@ -163,6 +169,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @Override public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { + playbackError = null; PlaybackInfo playbackInfo = getResetPlaybackInfo( resetPosition, resetState, /* playbackState= */ Player.STATE_BUFFERING); @@ -325,6 +332,9 @@ import java.util.concurrent.CopyOnWriteArraySet; @Override public void stop(boolean reset) { + if (reset) { + playbackError = null; + } PlaybackInfo playbackInfo = getResetPlaybackInfo( /* resetPosition= */ reset, @@ -560,9 +570,9 @@ import java.util.concurrent.CopyOnWriteArraySet; } break; case ExoPlayerImplInternal.MSG_ERROR: - ExoPlaybackException exception = (ExoPlaybackException) msg.obj; + playbackError = (ExoPlaybackException) msg.obj; for (Player.EventListener listener : listeners) { - listener.onPlayerError(exception); + listener.onPlayerError(playbackError); } break; default: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Player.java b/library/core/src/main/java/com/google/android/exoplayer2/Player.java index 85872339a3..743a0241bd 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Player.java @@ -459,6 +459,17 @@ public interface Player { */ int getPlaybackState(); + /** + * Returns the error that caused playback to fail. This is the same error that will have been + * reported via @link Player.EventListener#onPlayerError(ExoPlaybackException)} at the time of + * failure. It can be queried using this method until {@code stop(true)} is called or the player + * is re-prepared. + * + * @return The error, or {@code null}. + */ + @Nullable + Exception getPlaybackError(); + /** * Sets whether playback should proceed when {@link #getPlaybackState()} == {@link #STATE_READY}. *

diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index b998027eb3..9a73f68f34 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -653,6 +653,11 @@ public class SimpleExoPlayer implements ExoPlayer, Player.VideoComponent, Player return player.getPlaybackState(); } + @Override + public ExoPlaybackException getPlaybackError() { + return player.getPlaybackError(); + } + @Override public void prepare(MediaSource mediaSource) { prepare(mediaSource, /* resetPosition= */ true, /* resetState= */ true); diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 8de92ddfa9..d81cef9d8a 100644 --- a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.testutil; import android.os.Looper; import android.support.annotation.Nullable; +import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; @@ -63,6 +64,11 @@ public abstract class StubExoPlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public ExoPlaybackException getPlaybackError() { + throw new UnsupportedOperationException(); + } + @Override public void prepare(MediaSource mediaSource) { throw new UnsupportedOperationException();