MediaSession
public
class
MediaSession
extends Object
implements
Closeable
java.lang.Object | |
↳ | androidx.media2.session.MediaSession |
Allows a media app to expose its transport controls and playback information in a process to other processes including the Android framework and other apps. Common use cases are as follows.
- Bluetooth/wired headset key events support
- Android Auto/Wearable support
- Separating UI process and playback process
A MediaSession should be created when an app wants to publish media playback information or handle media keys. In general an app only needs one session for all playback, though multiple sessions can be created to provide finer grain controls of media. See Supporting Multiple Sessions for detail.
If you want to support background playback, MediaSessionService
is preferred
instead. With it, your playback can be revived even after playback is finished. See
MediaSessionService
for details.
Topics covered here:
- Session Lifecycle
- Thread
- Media key events mapping
- Supporting Multiple Sessions
- Backward compatibility with legacy session APIs
- Backward compatibility with legacy controller APIs
Session Lifecycle
A session can be obtained by MediaSession.Builder
. The owner of the session may pass its session token
to other processes to allow them to create a MediaController
to interact with the
session.
When a session receive transport control commands, the session sends the commands directly to
the underlying media player set by MediaSession.Builder
or updatePlayer(SessionPlayer)
.
When an app is finished performing playback it must call close()
to clean up the session
and notify any controllers. The app is responsible for closing the underlying player after
closing the session.
is closed.
Thread
MediaSession
objects are thread safe, but should be used on the thread on the looper.
Media key events mapping
Here's the table of per key event.
Supporting Multiple Sessions
Generally speaking, multiple sessions aren't necessary for most media apps. One exception is if your app can play multiple media content at the same time, but only for the playback of video-only media or remote playback, since audio focus policy recommends not playing multiple audio content at the same time. Also keep in mind that multiple media sessions would make Android Auto and Bluetooth device with display to show your apps multiple times, because they list up media sessions, not media apps.Backward compatibility with legacy session APIs
An activeMediaSessionCompat
is internally created with the MediaSession for the backward
compatibility. It's used to handle incoming connection and command from
MediaControllerCompat
. And helps to utilize existing APIs that are built with legacy
media session APIs. Use getSessionCompatToken()
for getting the token for the underlying
MediaSessionCompat.
Backward compatibility with legacy controller APIs
In addition to themedia2 controller
API, session also supports
connection from the legacy controller API -
framework controller
and
AndroidX controller compat
.
However, MediaSession.ControllerInfo
may not be precise for legacy controller.
See MediaSession.ControllerInfo
for the details.
Unknown package name nor UID doesn't mean that you should disallow connection nor commands. For SDK levels where such issue happen, session tokens could only be obtained by trusted apps (e.g. Bluetooth, Auto, ...), so it may be better for you to allow them as you did with legacy session.
See also:
Summary
Nested classes | |
---|---|
class |
MediaSession.Builder
Builder for |
class |
MediaSession.CommandButton
Button for a |
class |
MediaSession.ControllerInfo
Information of a controller. |
class |
MediaSession.SessionCallback
Callback to be called for all incoming commands from |
Public methods | |
---|---|
void
|
broadcastCustomCommand(SessionCommand command, Bundle args)
Broadcasts a custom command to all connected controllers. |
void
|
close()
|
List<MediaSession.ControllerInfo>
|
getConnectedControllers()
Returns the list of connected controller. |
String
|
getId()
Gets the session ID |
SessionPlayer
|
getPlayer()
Gets the underlying |
MediaSessionCompat.Token
|
getSessionCompatToken()
Gets the |
SessionToken
|
getToken()
Returns the |
ListenableFuture<SessionResult>
|
sendCustomCommand(MediaSession.ControllerInfo controller, SessionCommand command, Bundle args)
Sends a custom command to a specific controller. |
void
|
setAllowedCommands(MediaSession.ControllerInfo controller, SessionCommandGroup commands)
Sets the new allowed command group for the controller. |
ListenableFuture<SessionResult>
|
setCustomLayout(MediaSession.ControllerInfo controller, List<MediaSession.CommandButton> layout)
Sets ordered list of |
void
|
updatePlayer(SessionPlayer player)
Updates the underlying |
Inherited methods | |
---|---|
Public methods
broadcastCustomCommand
public void broadcastCustomCommand (SessionCommand command, Bundle args)
Broadcasts a custom command to all connected controllers.
This is synchronous call and doesn't wait for result from the controller. Use
sendCustomCommand(ControllerInfo, SessionCommand, Bundle)
for getting the result.
A command is not accepted if it is not a custom command.
Parameters | |
---|---|
command |
SessionCommand : a command |
args |
Bundle : optional argument |
close
public void close ()
getConnectedControllers
public List<MediaSession.ControllerInfo> getConnectedControllers ()
Returns the list of connected controller.
Returns | |
---|---|
List<MediaSession.ControllerInfo> |
list of MediaSession.ControllerInfo
|
getId
public String getId ()
Gets the session ID
Returns | |
---|---|
String |
getPlayer
public SessionPlayer getPlayer ()
Gets the underlying SessionPlayer
.
When the session is closed, it returns the lastly set player.
Returns | |
---|---|
SessionPlayer |
player. |
getSessionCompatToken
public MediaSessionCompat.Token getSessionCompatToken ()
Gets the MediaSessionCompat.Token
for the MediaSessionCompat created internally
by this session.
Returns | |
---|---|
MediaSessionCompat.Token |
MediaSessionCompat.Token
|
getToken
public SessionToken getToken ()
Returns the SessionToken
for creating MediaController
.
Returns | |
---|---|
SessionToken |
sendCustomCommand
public ListenableFuture<SessionResult> sendCustomCommand (MediaSession.ControllerInfo controller, SessionCommand command, Bundle args)
Sends a custom command to a specific controller.
A command is not accepted if it is not a custom command.
Parameters | |
---|---|
controller |
MediaSession.ControllerInfo |
command |
SessionCommand : a command |
args |
Bundle : optional argument |
Returns | |
---|---|
ListenableFuture<SessionResult> |
setAllowedCommands
public void setAllowedCommands (MediaSession.ControllerInfo controller, SessionCommandGroup commands)
Sets the new allowed command group for the controller.
This is synchronous call. Changes in the allowed commands take effect immediately regardless
of the controller notified about the change through
#onAllowedCommandsChanged(MediaController, SessionCommandGroup)
Parameters | |
---|---|
controller |
MediaSession.ControllerInfo : controller to change allowed commands |
commands |
SessionCommandGroup : new allowed commands
|
setCustomLayout
public ListenableFuture<SessionResult> setCustomLayout (MediaSession.ControllerInfo controller, List<MediaSession.CommandButton> layout)
Sets ordered list of MediaSession.CommandButton
for controllers to build UI with it.
It's up to controller's decision how to represent the layout in its own UI. Here are some examples.
Note: layout[i]
means a CommandButton at index i in the given list
Controller UX layout | Layout example |
---|---|
Row with 3 icons | layout[1] layout[0] layout[2] |
Row with 5 icons | layout[3] layout[1] layout[0]
layout[2] layout[4] |
Row with 5 icons and an overflow icon, and another expandable row with 5 extra icons | layout[3] layout[1] layout[0]
layout[2] layout[4] |
layout[3] layout[1] layout[0]
layout[2] layout[4] |
This API can be called in the
MediaSession.SessionCallback.onConnect(MediaSession, ControllerInfo)
.
Parameters | |
---|---|
controller |
MediaSession.ControllerInfo : controller to specify layout. |
layout |
List : ordered list of layout.
|
Returns | |
---|---|
ListenableFuture<SessionResult> |
updatePlayer
public void updatePlayer (SessionPlayer player)
Updates the underlying SessionPlayer
for this session to dispatch incoming event to.
Parameters | |
---|---|
player |
SessionPlayer : a player that handles actual media playback in your app
|
Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2020-09-30 UTC.