Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

MediaController

open class MediaController : Closeable
kotlin.Any
   ↳ androidx.media2.session.MediaController

Allows an app to interact with an active or a MediaSessionService which would provide . Media buttons and other commands can be sent to the session.

MediaController objects are thread-safe.

Topics covered here:

  1. Controller Lifecycle
  2. Controlling the MediaSession in the same process

Controller Lifecycle

When a controller is created with the SessionToken for a MediaSession (i.e. session token type is SessionToken#TYPE_SESSION), the controller will connect to the specific session.

When a controller is created with the SessionToken for a MediaSessionService (i.e. session token type is SessionToken#TYPE_SESSION_SERVICE or SessionToken#TYPE_LIBRARY_SERVICE), the controller binds to the service for connecting to a MediaSession in it. MediaSessionService will provide a session to connect.

When a controller connects to a session, MediaSession.SessionCallback#onConnect(MediaSession, MediaSession.ControllerInfo) will be called to either accept or reject the connection. Wait ControllerCallback#onConnected(MediaController, SessionCommandGroup) or ControllerCallback#onDisconnected(MediaController) for the result.

When the connected session is closed, the controller will receive ControllerCallback#onDisconnected(MediaController).

When you're done, use #close() to clean up resources. This also helps session service to be destroyed when there's no controller associated with it.

Controlling the MediaSession in the same process

When you control the MediaSession and its SessionPlayer, it's recommended to use them directly rather than creating MediaController. However, if you need to use MediaController in the same process, be careful not to block session callback executor's thread. Here's an example code that would never return due to the thread issue.

<code>// Code runs on the main thread.
  MediaSession session = new MediaSession.Builder(context, player)
     .setSessionCallback(sessionCallback, Context.getMainExecutor(context)).build();
  MediaController controller = new MediaController.Builder(context)
     .setSessionToken(session.getToken())
     .setControllerCallback(Context.getMainExecutor(context), controllerCallback)
     .build();
 
  // This will hang and never return.
  controller.play().get();</code>
When a session gets a command from a controller, the session's MediaSession.SessionCallback#onCommandRequest would be executed on the session's callback executor to decide whether to ignore or handle the incoming command. To do so, the session's callback executor shouldn't be blocked to handle the incoming calls. However, if you call ListenableFuture#get on the thread for the session callback executor, then your call wouldn't be executed and never return.

To avoid such issue, don't block the session callback executor's thread. Creating a dedicated thread for the session callback executor would be helpful. See Executors#newSingleThreadExecutor for creating a new thread.

Summary

Nested classes

Builder for MediaController.

abstract

Interface for listening to change in activeness of the MediaSession.

Holds information about the way volume is handled for this session.

Public methods
open ListenableFuture<SessionResult!>
addPlaylistItem(@IntRange(0) index: Int, @NonNull mediaId: String)

Requests that the SessionPlayer associated with the connected MediaSession adds the media item to the playlist at the index with the media ID.

open ListenableFuture<SessionResult!>
adjustVolume(direction: Int, flags: Int)

Requests that the connected MediaSession adjusts the volume of the output that is playing on.

open Unit

Releases this object, and disconnects from the session.

open ListenableFuture<SessionResult!>

Requests that the SessionPlayer associated with the connected MediaSession deselects the TrackInfo for the current media item.

open ListenableFuture<SessionResult!>

Requests that the SessionPlayer associated with the connected MediaSession to fast forward playback.

open SessionCommandGroup?

Gets the cached allowed commands from ControllerCallback#onAllowedCommandsChanged.

open Long

Gets the position for how much has been buffered of the SessionPlayer associated with the connected MediaSession, or SessionPlayer#UNKNOWN_TIME if unknown or not connected.

open Int

Gets the current buffering state of the SessionPlayer associated with the connected MediaSession.

open SessionToken?

Returns the SessionToken of the connected session.

open MediaItem?

Gets the current media item of the SessionPlayer associated with the connected MediaSession.

open Int

Gets the current item index in the playlist of the SessionPlayer associated with the connected MediaSession.

open Long

Gets the playback position of the SessionPlayer associated with the connected MediaSession.

open Long

Gets the duration of the current media item, or