{"record":{"id":"7069ee957c9ddb4d","repo":"google/ExoPlayer","slug":"missing-implementation-to-handle-command-set-track","errorCode":null,"errorMessage":"Missing implementation to handle COMMAND_SET_TRACK_SELECTION_PARAMETERS","messagePattern":"Missing implementation to handle COMMAND_SET_TRACK_SELECTION_PARAMETERS","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java","lineNumber":3023,"sourceCode":"   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetPlaybackParameters(PlaybackParameters playbackParameters) {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_SET_SPEED_AND_PITCH\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setTrackSelectionParameters}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_TRACK_SELECTION_PARAMETERS} is available.\n   *\n   * @param trackSelectionParameters The requested {@link TrackSelectionParameters}.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetTrackSelectionParameters(\n      TrackSelectionParameters trackSelectionParameters) {\n    throw new IllegalStateException(\n        \"Missing implementation to handle COMMAND_SET_TRACK_SELECTION_PARAMETERS\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setPlaylistMetadata}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_PLAYLIST_METADATA} is available.\n   *\n   * @param playlistMetadata The requested {@linkplain MediaMetadata playlist metadata}.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetPlaylistMetadata(MediaMetadata playlistMetadata) {\n    throw new IllegalStateException(\n        \"Missing implementation to handle COMMAND_SET_PLAYLIST_METADATA\");\n  }\n","sourceCodeStart":3005,"sourceCodeEnd":3041,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java#L3005-L3041","documentation":"Default handler for Player.setTrackSelectionParameters(...) in SimpleBasePlayer: IllegalStateException when COMMAND_SET_TRACK_SELECTION_PARAMETERS is available but handleSetTrackSelectionParameters(TrackSelectionParameters) is not overridden in the subclass.","triggerScenarios":"player.setTrackSelectionParameters(defaults.buildUpon().setMaxAudioBitrate(...).build()) — common in settings screens — on a SimpleBasePlayer subclass missing the override while the command is in availableCommands.","commonSituations":"Apps with audio/video preference screens calling setTrackSelectionParameters; MediaController track-selection commands forwarded to a custom player.","solutions":["Override handleSetTrackSelectionParameters(...) to merge the parameters into your State via state.buildUpon().setTrackSelectionParameters(...).","If track selection is fixed, remove COMMAND_SET_TRACK_SELECTION_PARAMETERS from the State's commands so calls become inert and the UI hides the controls.","Consider intersecting requested overrides with what your backend can actually honor."],"exampleFix":"// before\n// no override; settings screen calls setTrackSelectionParameters -> throws\n\n// after\n@Override\nprotected ListenableFuture<?> handleSetTrackSelectionParameters(\n    TrackSelectionParameters trackSelectionParameters) {\n  return updateStateAndNotify(\n      state.buildUpon().setTrackSelectionParameters(trackSelectionParameters).build());\n}","handlingStrategy":"validation","validationCode":"if (!supportsTrackSelection) commands.remove(Player.COMMAND_SET_TRACK_SELECTION_PARAMETERS);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Implement handleSetTrackSelectionParameters() or exclude the command.","Merge (not replace) parameters if your player only honors a subset.","Trigger the command from your app's settings screen in tests."],"tags":["simplebaseplayer","custom-player","track-selection","media3","contract"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}