Wire up MediaMetricsListener and add configuration to disable it.

The listener will automatically forward diagnostics info to the
Android platform. ExoPlayer.Builder gets a new setter that allows
to disable this feature if required.

#minor-release

PiperOrigin-RevId: 426099872
This commit is contained in:
tonihei 2022-02-03 11:17:42 +00:00 committed by Ian Baker
parent 1391b7c65d
commit 08c5b1cb0a
3 changed files with 50 additions and 4 deletions

View File

@ -43,6 +43,15 @@
* Rename `DecoderCounters#inputBufferCount` to `queuedInputBufferCount`. * Rename `DecoderCounters#inputBufferCount` to `queuedInputBufferCount`.
* Make `SimpleExoPlayer.renderers` private. Renderers can be accessed via * Make `SimpleExoPlayer.renderers` private. Renderers can be accessed via
`ExoPlayer.getRenderer`. `ExoPlayer.getRenderer`.
* Enable support for Android platform diagnostics via
`MediaMetricsManager`. ExoPlayer will forward playback events and
performance data to the platform, which helps to provide system
performance and debugging information on the device. This data may also
be collected by Google
[if sharing usage and diagnostics data is enabled](https://support.google.com/accounts/answer/6078260)
by the user of the device. Apps can opt-out of contributing to platform
diagnostics for ExoPlayer with
`ExoPlayer.Builder.setUsePlatformDiagnostics(false)`.
* Android 12 compatibility: * Android 12 compatibility:
* Upgrade the Cast extension to depend on * Upgrade the Cast extension to depend on
`com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier `com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier

View File

@ -389,6 +389,7 @@ public interface ExoPlayer extends Player {
/* package */ long releaseTimeoutMs; /* package */ long releaseTimeoutMs;
/* package */ long detachSurfaceTimeoutMs; /* package */ long detachSurfaceTimeoutMs;
/* package */ boolean pauseAtEndOfMediaItems; /* package */ boolean pauseAtEndOfMediaItems;
/* package */ boolean usePlatformDiagnostics;
/* package */ boolean buildCalled; /* package */ boolean buildCalled;
/** /**
@ -429,6 +430,7 @@ public interface ExoPlayer extends Player {
* <li>{@code releaseTimeoutMs}: {@link #DEFAULT_RELEASE_TIMEOUT_MS} * <li>{@code releaseTimeoutMs}: {@link #DEFAULT_RELEASE_TIMEOUT_MS}
* <li>{@code detachSurfaceTimeoutMs}: {@link #DEFAULT_DETACH_SURFACE_TIMEOUT_MS} * <li>{@code detachSurfaceTimeoutMs}: {@link #DEFAULT_DETACH_SURFACE_TIMEOUT_MS}
* <li>{@code pauseAtEndOfMediaItems}: {@code false} * <li>{@code pauseAtEndOfMediaItems}: {@code false}
* <li>{@code usePlatformDiagnostics}: {@code true}
* <li>{@link Clock}: {@link Clock#DEFAULT} * <li>{@link Clock}: {@link Clock#DEFAULT}
* </ul> * </ul>
* *
@ -577,6 +579,7 @@ public interface ExoPlayer extends Player {
clock = Clock.DEFAULT; clock = Clock.DEFAULT;
releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS; releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS;
detachSurfaceTimeoutMs = DEFAULT_DETACH_SURFACE_TIMEOUT_MS; detachSurfaceTimeoutMs = DEFAULT_DETACH_SURFACE_TIMEOUT_MS;
usePlatformDiagnostics = true;
} }
/** /**
@ -937,6 +940,27 @@ public interface ExoPlayer extends Player {
return this; return this;
} }
/**
* Sets whether the player reports diagnostics data to the Android platform.
*
* <p>If enabled, the player will use the {@link android.media.metrics.MediaMetricsManager} to
* create a {@link android.media.metrics.PlaybackSession} and forward playback events and
* performance data to this session. This helps to provide system performance and debugging
* information for media playback on the device. This data may also be collected by Google <a
* href="https://support.google.com/accounts/answer/6078260">if sharing usage and diagnostics
* data is enabled</a> by the user of the device.
*
* @param usePlatformDiagnostics Whether the player reports diagnostics data to the Android
* platform.
* @return This builder.
* @throws IllegalStateException If {@link #build()} has already been called.
*/
public Builder setUsePlatformDiagnostics(boolean usePlatformDiagnostics) {
checkState(!buildCalled);
this.usePlatformDiagnostics = usePlatformDiagnostics;
return this;
}
/** /**
* Sets the {@link Clock} that will be used by the player. Should only be set for testing * Sets the {@link Clock} that will be used by the player. Should only be set for testing
* purposes. * purposes.

View File

@ -110,6 +110,7 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.Renderer.MessageType; import com.google.android.exoplayer2.Renderer.MessageType;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.analytics.MediaMetricsListener;
import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
@ -359,7 +360,11 @@ import java.util.concurrent.TimeoutException;
playbackInfoUpdateHandler.post(() -> handlePlaybackInfo(playbackInfoUpdate)); playbackInfoUpdateHandler.post(() -> handlePlaybackInfo(playbackInfoUpdate));
playbackInfo = PlaybackInfo.createDummy(emptyTrackSelectorResult); playbackInfo = PlaybackInfo.createDummy(emptyTrackSelectorResult);
analyticsCollector.setPlayer(wrappingPlayer, applicationLooper); analyticsCollector.setPlayer(wrappingPlayer, applicationLooper);
PlayerId playerId = Util.SDK_INT < 31 ? new PlayerId() : Api31.createPlayerId(); PlayerId playerId =
Util.SDK_INT < 31
? new PlayerId()
: Api31.registerMediaMetricsListener(
applicationContext, /* player= */ this, builder.usePlatformDiagnostics);
internalPlayer = internalPlayer =
new ExoPlayerImplInternal( new ExoPlayerImplInternal(
renderers, renderers,
@ -3045,9 +3050,17 @@ import java.util.concurrent.TimeoutException;
private Api31() {} private Api31() {}
@DoNotInline @DoNotInline
public static PlayerId createPlayerId() { public static PlayerId registerMediaMetricsListener(
// TODO: Create a MediaMetricsListener and obtain LogSessionId from it. Context context, ExoPlayerImpl player, boolean usePlatformDiagnostics) {
@Nullable MediaMetricsListener listener = MediaMetricsListener.create(context);
if (listener == null) {
Log.w(TAG, "MediaMetricsService unavailable.");
return new PlayerId(LogSessionId.LOG_SESSION_ID_NONE); return new PlayerId(LogSessionId.LOG_SESSION_ID_NONE);
} }
if (usePlatformDiagnostics) {
player.addAnalyticsListener(listener);
}
return new PlayerId(listener.getLogSessionId());
}
} }
} }