# MediaLibraryService.MediaLibrarySession.Callback

Artifact: [androidx.media3:media3-session](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/session/MediaLibraryService.java+class:androidx.media3.session.MediaLibraryService.MediaLibrarySession.Callback)

*** ** * ** ***


```
public interface MediaLibraryService.MediaLibrarySession.Callback extends MediaSession.Callback
```

<br />

*** ** * ** ***

An extended `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback` for the `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession`.

When you return `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with `https://developer.android.com/reference/androidx/media3/common/MediaItem`, each item must have valid `https://developer.android.com/reference/androidx/media3/common/MediaItem#mediaId()` and specify `https://developer.android.com/reference/androidx/media3/common/MediaMetadata#isBrowsable()` and `https://developer.android.com/reference/androidx/media3/common/MediaMetadata#isPlayable()` in its `https://developer.android.com/reference/androidx/media3/common/MediaItem#mediaMetadata()`.

## Summary

| ### Public methods |
|---|---|
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://guava.dev/releases/snapshot-android/api/docs/com/google/common/collect/ImmutableList.html<https://developer.android.com/reference/androidx/media3/common/MediaItem>>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetChildren(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html parentId, @https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int page, @https://developer.android.com/reference/androidx/annotation/IntRange(from = 1) int pageSize, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests the child `https://developer.android.com/reference/androidx/media3/common/MediaItem` of the given parent id by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getChildren(java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/androidx/media3/common/MediaItem>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetItem(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html mediaId )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a `https://developer.android.com/reference/androidx/media3/common/MediaItem` by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getItem(java.lang.String)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/androidx/media3/common/MediaItem>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetLibraryRoot(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.session.MediaLibraryService.LibraryParams)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests the root `https://developer.android.com/reference/androidx/media3/common/MediaItem` by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getLibraryRoot(androidx.media3.session.MediaLibraryService.LibraryParams)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://guava.dev/releases/snapshot-android/api/docs/com/google/common/collect/ImmutableList.html<https://developer.android.com/reference/androidx/media3/common/MediaItem>>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetSearchResult(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html query, @https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int page, @https://developer.android.com/reference/androidx/annotation/IntRange(from = 1) int pageSize, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a search result with `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getSearchResult(java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onSearch(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html query, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a search with `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#search(java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onSubscribe(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html parentId, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` subscribes to the given parent id by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#subscribe(java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)`. |
| `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onUnsubscribe(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String)( https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser, https://developer.android.com/reference/java/lang/String.html parentId )` Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` unsubscribes from the given parent ID by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#unsubscribe(java.lang.String)`. |

### Inherited methods

From [androidx.media3.session.MediaSession.Callback](https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback) `default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/androidx/media3/common/MediaItem>>` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onAddMediaItems(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,java.util.List<androidx.media3.common.MediaItem>)(
https://developer.android.com/reference/androidx/media3/session/MediaSession mediaSession,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/androidx/media3/common/MediaItem> mediaItems
)`

Called when a controller requested to add new `https://developer.android.com/reference/androidx/media3/common/MediaItem` to the playlist via one of the `Player.addMediaItem(s)` methods.
`default https://developer.android.com/reference/androidx/media3/session/MediaSession.ConnectionResult` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onConnect(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo)(https://developer.android.com/reference/androidx/media3/session/MediaSession session, https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller)`

It's strongly recommended to override `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onConnectAsync(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo)` instead of this method.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/MediaSession.ConnectionResult>` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onConnectAsync(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller
)`

Called when a controller is about to connect to this session.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/SessionResult>` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onCustomCommand(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.session.SessionCommand,android.os.Bundle)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/androidx/media3/session/SessionCommand customCommand,
https://developer.android.com/reference/android/os/Bundle.html args
)`

Called when a controller sent a custom command through `https://developer.android.com/reference/androidx/media3/session/MediaController#sendCustomCommand(androidx.media3.session.SessionCommand,android.os.Bundle)`.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/SessionResult>` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onCustomCommand(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.session.SessionCommand,android.os.Bundle,androidx.media3.session.MediaSession.ProgressReporter)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/androidx/media3/session/SessionCommand customCommand,
https://developer.android.com/reference/android/os/Bundle.html args,
@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaSession.ProgressReporter progressReporter
)`

Called when a controller sent a custom command through `https://developer.android.com/reference/androidx/media3/session/MediaController#sendCustomCommand(androidx.media3.session.SessionCommand,android.os.Bundle,androidx.media3.session.MediaController.ProgressListener)`.
`default void` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onDisconnected(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller
)`

Called when a controller is disconnected.
`default boolean` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onMediaButtonEvent(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,android.content.Intent)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controllerInfo,
https://developer.android.com/reference/android/content/Intent.html intent
)`

Called when a media button event has been received by the session.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/MediaSession.MediaItemsWithStartPosition>` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
[onPlaybackResumption](https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPlaybackResumption(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo))(
https://developer.android.com/reference/androidx/media3/session/MediaSession mediaSession,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller
)`

**This method is deprecated.**

Override `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPlaybackResumption(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,boolean)` instead.

<br />

`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/MediaSession.MediaItemsWithStartPosition>` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPlaybackResumption(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,boolean)(
https://developer.android.com/reference/androidx/media3/session/MediaSession mediaSession,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
boolean isForPlayback
)`

Returns the playlist with which the player should be prepared when a controller requests to play without a current `https://developer.android.com/reference/androidx/media3/common/MediaItem`.
`default int` `@https://developer.android.com/reference/androidx/media3/session/SessionResult.Code
[onPlayerCommandRequest](https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPlayerCommandRequest(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,int))(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
@https://developer.android.com/reference/androidx/media3/common/Player.Command int playerCommand
)`

**This method is deprecated.**

Modify the `https://developer.android.com/reference/androidx/media3/common/Player#getAvailableCommands()` of the player or use `https://developer.android.com/reference/androidx/media3/session/MediaSession#setAvailableCommands(androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.session.SessionCommands,androidx.media3.common.Player.Commands)` instead.

<br />

`default void` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPlayerInteractionFinished(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.common.Player.Commands)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controllerInfo,
https://developer.android.com/reference/androidx/media3/common/Player.Commands playerCommands
)`

Called after all concurrent interactions with `https://developer.android.com/reference/androidx/media3/session/MediaSession#getPlayer()` from a controller have finished.
`default void` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onPostConnect(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller
)`

Called immediately after a controller is connected.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/MediaSession.MediaItemsWithStartPosition>` `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi
https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onSetMediaItems(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,java.util.List<androidx.media3.common.MediaItem>,int,long)(
https://developer.android.com/reference/androidx/media3/session/MediaSession mediaSession,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/androidx/media3/common/MediaItem> mediaItems,
int startIndex,
long startPositionMs
)`

Called when a controller requested to set `https://developer.android.com/reference/androidx/media3/common/MediaItem` to the playlist via one of the `Player.setMediaItem(s)` methods.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/SessionResult>` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onSetRating(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,androidx.media3.common.Rating)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/androidx/media3/common/Rating rating
)`

Called when a controller requested to set a rating for the current media item for the current user by `https://developer.android.com/reference/androidx/media3/session/MediaController#setRating(androidx.media3.common.Rating)`.
`default https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/SessionResult>` `https://developer.android.com/reference/androidx/media3/session/MediaSession.Callback#onSetRating(androidx.media3.session.MediaSession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,androidx.media3.common.Rating)(
https://developer.android.com/reference/androidx/media3/session/MediaSession session,
https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo controller,
https://developer.android.com/reference/java/lang/String.html mediaId,
https://developer.android.com/reference/androidx/media3/common/Rating rating
)`

Called when a controller requested to set a rating to a media for the current user by `https://developer.android.com/reference/androidx/media3/session/MediaController#setRating(java.lang.String,androidx.media3.common.Rating)`.

## Public methods

### onGetChildren

```
default ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> onGetChildren(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String parentId,
    @IntRange(from = 0) int page,
    @IntRange(from = 1) int pageSize,
    @Nullable MediaLibraryService.LibraryParams params
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests the child `https://developer.android.com/reference/androidx/media3/common/MediaItem` of the given parent id by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getChildren(java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

The `https://developer.android.com/reference/androidx/media3/session/LibraryResult#params()` should be the same as the given `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams`.

To allow getting the children, return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` and a list of `https://developer.android.com/reference/androidx/media3/common/MediaItem`. Return an empty list for no children rather than using error codes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html parentId` | The non-empty parent id. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int page` | The page number to get the paginated result starting from `0`. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 1) int pageSize` | The page size to get the paginated result. Will be greater than `0`. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params` | The optional parameters passed by the browser. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://guava.dev/releases/snapshot-android/api/docs/com/google/common/collect/ImmutableList.html<https://developer.android.com/reference/androidx/media3/common/MediaItem>>>` | A pending result that will be resolved with a list of media items. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_GET_CHILDREN()` |   |

### onGetItem

```
default ListenableFuture<LibraryResult<MediaItem>> onGetItem(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String mediaId
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a `https://developer.android.com/reference/androidx/media3/common/MediaItem` by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getItem(java.lang.String)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

To allow getting the item, return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` and a `https://developer.android.com/reference/androidx/media3/common/MediaItem` with a valid `https://developer.android.com/reference/androidx/media3/common/MediaItem#mediaId()`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html mediaId` | The non-empty media id of the requested item. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/androidx/media3/common/MediaItem>>` | A pending result that will be resolved with a media item. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_GET_ITEM()` |   |

### onGetLibraryRoot

```
default ListenableFuture<LibraryResult<MediaItem>> onGetLibraryRoot(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    @Nullable MediaLibraryService.LibraryParams params
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests the root `https://developer.android.com/reference/androidx/media3/common/MediaItem` by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getLibraryRoot(androidx.media3.session.MediaLibraryService.LibraryParams)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

The `https://developer.android.com/reference/androidx/media3/session/LibraryResult#params()` may differ from the given `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams` if the session can't provide a root that matches with the `params`.

To allow browsing the media library, return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` and a root `https://developer.android.com/reference/androidx/media3/common/MediaItem` with a valid `https://developer.android.com/reference/androidx/media3/common/MediaItem#mediaId()`. The media id is required for the browser to get the children under the root.

Interoperability: If this callback is called because a legacy `
android.support.v4.media.MediaBrowserCompat` has requested a `
androidx.media.MediaBrowserServiceCompat.BrowserRoot`, then the main thread may be blocked until the returned future is done. If your service may be queried by a legacy `
android.support.v4.media.MediaBrowserCompat`, you should ensure that the future completes quickly to avoid blocking the main thread for a long period of time. In particular, the returned future must not be completed on or by posting to the application thread (or main thread), as this will cause a deadlock while the thread is blocked.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params` | The optional parameters passed by the browser. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/androidx/media3/common/MediaItem>>` | A pending result that will be resolved with a root media item. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_GET_LIBRARY_ROOT()` |   |

### onGetSearchResult

```
default ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> onGetSearchResult(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String query,
    @IntRange(from = 0) int page,
    @IntRange(from = 1) int pageSize,
    @Nullable MediaLibraryService.LibraryParams params
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a search result with `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#getSearchResult(java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

The `https://developer.android.com/reference/androidx/media3/session/LibraryResult#params()` should be the same as the given `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams`.

To allow getting the search result, return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` and a list of `https://developer.android.com/reference/androidx/media3/common/MediaItem`. Return an empty list for no children rather than using error codes.

Typically, the `query` is requested through `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onSearch(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)` before, but it may not especially when `
android.support.v4.media.MediaBrowserCompat.search()` is used.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html query` | The non-empty search query. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int page` | The page number to get the paginated result starting from `0`. |
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 1) int pageSize` | The page size to get the paginated result. Will be greater than `0`. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params` | The optional parameters passed by the browser. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://guava.dev/releases/snapshot-android/api/docs/com/google/common/collect/ImmutableList.html<https://developer.android.com/reference/androidx/media3/common/MediaItem>>>` | A pending result that will be resolved with a list of media items. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_GET_SEARCH_RESULT()` |   |

### onSearch

```
default ListenableFuture<LibraryResult<Void>> onSearch(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String query,
    @Nullable MediaLibraryService.LibraryParams params
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` requests a search with `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#search(java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

The `https://developer.android.com/reference/androidx/media3/session/LibraryResult#params()` should be the same as the given `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams`.

Return `https://developer.android.com/reference/androidx/media3/session/LibraryResult` with a result code for the search and notify the number of search result (`https://developer.android.com/reference/androidx/media3/common/MediaItem`) through `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession#notifySearchResultChanged(androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,androidx.media3.session.MediaLibraryService.LibraryParams)`. `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` will ask the search result afterwards through `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetSearchResult(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,int,androidx.media3.session.MediaLibraryService.LibraryParams)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html query` | The non-empty search query. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params` | The optional parameters passed by the browser. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | A pending result that will be resolved with a result code. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_SEARCH()` |   |

### onSubscribe

```
default ListenableFuture<LibraryResult<Void>> onSubscribe(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String parentId,
    @Nullable MediaLibraryService.LibraryParams params
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` subscribes to the given parent id by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#subscribe(java.lang.String,androidx.media3.session.MediaLibraryService.LibraryParams)`.

See `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession#getSubscribedControllers(java.lang.String)` also.

By default, the library calls `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession.Callback#onGetItem(androidx.media3.session.MediaLibraryService.MediaLibrarySession,androidx.media3.session.MediaSession.ControllerInfo,java.lang.String)` for the `parentId` that the browser requests to subscribe to. If onGetItem returns `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` with a `https://developer.android.com/reference/androidx/media3/common/MediaMetadata#isBrowsable()`, the subscription is accepted and `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession#notifyChildrenChanged(androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,androidx.media3.session.MediaLibraryService.LibraryParams)` is immediately called with an itemCount of `https://developer.android.com/reference/java/lang/Integer.html#MAX_VALUE`. In all other cases, the subscription is rejected and a result value different to `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` is returned from this method.

To implement a different behavior, an app can safely override this method without calling super. Return a result code `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` to accept the subscription, or return a result different to `https://developer.android.com/reference/androidx/media3/session/LibraryResult#RESULT_SUCCESS()` to prevent controllers from subscribing.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

The `https://developer.android.com/reference/androidx/media3/session/LibraryResult#params()` returned to the caller should be the same as the `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams` passed into this method.

Interoperability: This will be called by `
android.support.v4.media.MediaBrowserCompat.subscribe()`, but won't be called by `https://developer.android.com/reference/android/media/browse/MediaBrowser.html#subscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html parentId` | The non-empty parent id. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.LibraryParams params` | The optional parameters passed by the browser. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | A pending result that will be resolved with a result code. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_SUBSCRIBE()` |   |

### onUnsubscribe

```
default ListenableFuture<LibraryResult<Void>> onUnsubscribe(
    MediaLibraryService.MediaLibrarySession session,
    MediaSession.ControllerInfo browser,
    String parentId
)
```

Called when a `https://developer.android.com/reference/androidx/media3/session/MediaBrowser` unsubscribes from the given parent ID by `https://developer.android.com/reference/androidx/media3/session/MediaBrowser#unsubscribe(java.lang.String)`.

Return a `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html` to send a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` back to the browser asynchronously. You can also return a `https://developer.android.com/reference/androidx/media3/session/LibraryResult` directly by using Guava's `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/Futures.html#immediateFuture(V)`.

Apps normally don't need to implement this method, because the library maintains the subscribed controllers internally and an app can use `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession#getSubscribedControllers(java.lang.String)` to get subscribed controllers for which to call `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession#notifyChildrenChanged(androidx.media3.session.MediaSession.ControllerInfo,java.lang.String,int,androidx.media3.session.MediaLibraryService.LibraryParams)`.

Interoperability: This will be called by `
android.support.v4.media.MediaBrowserCompat.unsubscribe()`, but won't be called by `https://developer.android.com/reference/android/media/browse/MediaBrowser.html#unsubscribe(java.lang.String)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/MediaLibraryService.MediaLibrarySession session` | The session for this event. |
| `https://developer.android.com/reference/androidx/media3/session/MediaSession.ControllerInfo browser` | The browser information. |
| `https://developer.android.com/reference/java/lang/String.html parentId` | The non-empty parent id. |

| Returns |
|---|---|
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<https://developer.android.com/reference/androidx/media3/session/LibraryResult<https://developer.android.com/reference/java/lang/Void.html>>` | A pending result that will be resolved with a result code. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/session/SessionCommand#COMMAND_CODE_LIBRARY_UNSUBSCRIBE()` |   |