Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Nested Classes](https://developer.android.com/reference/android/media/MediaRouter2#nestedclasses) \| [Methods](https://developer.android.com/reference/android/media/MediaRouter2#pubmethods) \| [Inherited Methods](https://developer.android.com/reference/android/media/MediaRouter2#inhmethods)

# MediaRouter2

*** ** * ** ***


`
public

final

class
MediaRouter2
`


`

extends https://developer.android.com/reference/java/lang/Object


`

`


`

|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | android.media.MediaRouter2 |

<br />

*** ** * ** ***

This API is not generally intended for third party application developers. Use the
[AndroidX](https://developer.android.com/jetpack/androidx)
[Media Router
Library](https://developer.android.com/reference/androidx/mediarouter/media/package-summary) for consistent behavior across all devices.

MediaRouter2 allows applications to control the routing of media channels and streams from
the current device to remote speakers and devices.

## Summary

| ### Nested classes ||
|---|---|
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback` Callback for receiving `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` updates. |
| ` interface` | `https://developer.android.com/reference/android/media/MediaRouter2.DeviceSuggestionsUpdatesCallback` Callback for receiving events about device suggestions |
| ` interface` | `https://developer.android.com/reference/android/media/MediaRouter2.OnGetControllerHintsListener` A listener interface to send optional app-specific hints when creating a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController`. |
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback` Callback for receiving events about media route discovery. |
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` Controls a media routing session. |
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.ScanRequest` Represents a set of parameters for scanning requests. |
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken` Represents an active scan request registered in the system. |
| ` class` | `https://developer.android.com/reference/android/media/MediaRouter2.TransferCallback` Callback for receiving events on media transfer. |

| ### Public methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#cancelScanRequest(android.media.MediaRouter2.ScanToken)(https://developer.android.com/reference/android/media/MediaRouter2.ScanToken token) ` Releases the active scan request linked to the provided `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#clearDeviceSuggestions()() ` Clears the `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` provided by this router. |
| ` https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` | ` https://developer.android.com/reference/android/media/MediaRouter2#getController(java.lang.String)(https://developer.android.com/reference/java/lang/String id) ` Gets a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` whose ID is equal to the given ID. |
| ` https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/MediaRouter2.RoutingController>` | ` https://developer.android.com/reference/android/media/MediaRouter2#getControllers()() ` Gets the list of currently active `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` on which media can be played. |
| ` https://developer.android.com/reference/java/util/Map<https://developer.android.com/reference/java/lang/String, https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/SuggestedDeviceInfo>>` | ` https://developer.android.com/reference/android/media/MediaRouter2#getDeviceSuggestions()() ` Gets the current suggested devices. |
| ` static https://developer.android.com/reference/android/media/MediaRouter2` | ` https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context)(https://developer.android.com/reference/android/content/Context context) ` Gets an instance of the media router associated with the context. |
| ` static https://developer.android.com/reference/android/media/MediaRouter2` | ` https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context,%20java.lang.String,%20java.util.concurrent.Executor,%20java.lang.Runnable)(https://developer.android.com/reference/android/content/Context context, https://developer.android.com/reference/java/lang/String clientPackageName, https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/java/lang/Runnable onInstanceInvalidatedListener) ` Returns a proxy MediaRouter2 instance that allows you to control the routing of an app specified by `clientPackageName`. |
| ` https://developer.android.com/reference/android/media/RouteListingPreference` | ` https://developer.android.com/reference/android/media/MediaRouter2#getRouteListingPreference()() ` Returns the current `https://developer.android.com/reference/android/media/RouteListingPreference` of the target router. |
| ` https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/MediaRoute2Info>` | ` https://developer.android.com/reference/android/media/MediaRouter2#getRoutes()() ` Gets the unmodifiable list of `https://developer.android.com/reference/android/media/MediaRoute2Info` currently known to the media router. |
| ` https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` | ` https://developer.android.com/reference/android/media/MediaRouter2#getSystemController()() ` Gets a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` which can control the routes provided by system. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#registerControllerCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.ControllerCallback)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback callback) ` Registers a `https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#registerDeviceSuggestionsUpdatesCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.DeviceSuggestionsUpdatesCallback)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/MediaRouter2.DeviceSuggestionsUpdatesCallback deviceSuggestionsUpdatesCallback) ` Registers the given callback to be invoked when the `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` of the target router changes. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#registerRouteCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.RouteCallback,%20android.media.RouteDiscoveryPreference)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback routeCallback, https://developer.android.com/reference/android/media/RouteDiscoveryPreference preference) ` Registers a callback to discover routes and to receive events when they change. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#registerRouteListingPreferenceUpdatedCallback(java.util.concurrent.Executor,%20java.util.function.Consumer<android.media.RouteListingPreference>)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/java/util/function/Consumer<https://developer.android.com/reference/android/media/RouteListingPreference> routeListingPreferenceCallback) ` Registers the given callback to be invoked when the `https://developer.android.com/reference/android/media/RouteListingPreference` of the target router changes. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#registerTransferCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.TransferCallback)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/MediaRouter2.TransferCallback callback) ` Registers a callback to get the result of `https://developer.android.com/reference/android/media/MediaRouter2#transferTo(android.media.MediaRoute2Info)`. |
| ` https://developer.android.com/reference/android/media/MediaRouter2.ScanToken` | ` https://developer.android.com/reference/android/media/MediaRouter2#requestScan(android.media.MediaRouter2.ScanRequest)(https://developer.android.com/reference/android/media/MediaRouter2.ScanRequest scanRequest) ` Requests the system to actively scan for routes based on the router's `https://developer.android.com/reference/android/media/RouteDiscoveryPreference`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#setDeviceSuggestions(java.util.List<android.media.SuggestedDeviceInfo>)(https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/SuggestedDeviceInfo> suggestedDeviceInfo) ` Sets a list of `https://developer.android.com/reference/android/media/SuggestedDeviceInfo`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#setOnGetControllerHintsListener(android.media.MediaRouter2.OnGetControllerHintsListener)(https://developer.android.com/reference/android/media/MediaRouter2.OnGetControllerHintsListener listener) ` Sets an `https://developer.android.com/reference/android/media/MediaRouter2.OnGetControllerHintsListener` to send hints when creating a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#setRouteListingPreference(android.media.RouteListingPreference)(https://developer.android.com/reference/android/media/RouteListingPreference routeListingPreference) ` Sets the `https://developer.android.com/reference/android/media/RouteListingPreference` of the app associated to this media router. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#setRouteVolume(android.media.MediaRoute2Info,%20int)(https://developer.android.com/reference/android/media/MediaRoute2Info route, int volume) ` Sets the volume for a specific route. |
| ` boolean` | ` https://developer.android.com/reference/android/media/MediaRouter2#showSystemOutputSwitcher(android.media.session.MediaSession.Token)(https://developer.android.com/reference/android/media/session/MediaSession.Token sessionToken) ` Shows the system output switcher dialog for a specific `https://developer.android.com/reference/android/media/session/MediaSession`. |
| ` boolean` | ` https://developer.android.com/reference/android/media/MediaRouter2#showSystemOutputSwitcher()() ` Shows the system output switcher dialog. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#stop()() ` Stops the current media routing. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#transferTo(android.media.MediaRoute2Info)(https://developer.android.com/reference/android/media/MediaRoute2Info route) ` Transfers the current media to the given route. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#unregisterControllerCallback(android.media.MediaRouter2.ControllerCallback)(https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback callback) ` Unregisters a `https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback`. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#unregisterDeviceSuggestionsUpdatesCallback(android.media.MediaRouter2.DeviceSuggestionsUpdatesCallback)(https://developer.android.com/reference/android/media/MediaRouter2.DeviceSuggestionsUpdatesCallback callback) ` Unregisters the given callback to not receive `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` change events. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#unregisterRouteCallback(android.media.MediaRouter2.RouteCallback)(https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback routeCallback) ` Unregisters the given callback. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#unregisterRouteListingPreferenceUpdatedCallback(java.util.function.Consumer<android.media.RouteListingPreference>)(https://developer.android.com/reference/java/util/function/Consumer<https://developer.android.com/reference/android/media/RouteListingPreference> callback) ` Unregisters the given callback to not receive `https://developer.android.com/reference/android/media/RouteListingPreference` change events. |
| ` void` | ` https://developer.android.com/reference/android/media/MediaRouter2#unregisterTransferCallback(android.media.MediaRouter2.TransferCallback)(https://developer.android.com/reference/android/media/MediaRouter2.TransferCallback callback) ` Unregisters the given callback. |

### Inherited methods

From class `

https://developer.android.com/reference/java/lang/Object

` `


https://developer.android.com/reference/java/lang/Object` `
https://developer.android.com/reference/java/lang/Object#clone()()
`

Creates and returns a copy of this object.


`


boolean` `
https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj)
`

Indicates whether some other object is "equal to" this one.


`


void` `
https://developer.android.com/reference/java/lang/Object#finalize()()
`

Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.


`


final

https://developer.android.com/reference/java/lang/Class<?>` `
https://developer.android.com/reference/java/lang/Object#getClass()()
`

Returns the runtime class of this `Object`.


`


int` `
https://developer.android.com/reference/java/lang/Object#hashCode()()
`

Returns a hash code value for the object.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#notify()()
`

Wakes up a single thread that is waiting on this object's
monitor.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#notifyAll()()
`

Wakes up all threads that are waiting on this object's monitor.


`


https://developer.android.com/reference/java/lang/String` `
https://developer.android.com/reference/java/lang/Object#toString()()
`

Returns a string representation of the object.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos)
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*, or until a
certain amount of real time has elapsed.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis)
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*, or until a
certain amount of real time has elapsed.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait()()
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*.


## Public methods

### cancelScanRequest

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void cancelScanRequest (MediaRouter2.ScanToken token)
```

Releases the active scan request linked to the provided `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken`.

<br />

| Parameters ||
|---|---|
| `token` | `MediaRouter2.ScanToken`: `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken` of the `https://developer.android.com/reference/android/media/MediaRouter2.ScanRequest` to release. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if the token does not match any active scan request. |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#requestScan(android.media.MediaRouter2.ScanRequest)`

### clearDeviceSuggestions

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public void clearDeviceSuggestions ()
```

Clears the `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` provided by this router.

Use this method to tell the system that this router is not currently providing any
suggestions.

If the router explicitly wants to recommend that no suggestion is appropriate, use `https://developer.android.com/` with an empty list

<br />

### getController

Added in [API level 31](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public MediaRouter2.RoutingController getController (String id)
```

Gets a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` whose ID is equal to the given ID.
Returns `null` if there is no matching controller.

<br />

| Parameters ||
|---|---|
| `id` | `String`: This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` | <br /> |

### getControllers

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public List<MediaRouter2.RoutingController> getControllers ()
```

Gets the list of currently active `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` on which
media can be played.

Note: The list returned here will never be empty. The first element in the list is
always the `https://developer.android.com/reference/android/media/MediaRouter2#getSystemController()`.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/MediaRouter2.RoutingController>` | This value cannot be `null`. <br /> |

### getDeviceSuggestions

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestions ()
```

Gets the current suggested devices.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/Map<https://developer.android.com/reference/java/lang/String, https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/SuggestedDeviceInfo>>` | the suggested devices, keyed by the package name providing each suggestion list. This value cannot be `null`. <br /> |

### getInstance

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static MediaRouter2 getInstance (Context context)
```

Gets an instance of the media router associated with the context.

<br />

| Parameters ||
|---|---|
| `context` | `Context`: This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/MediaRouter2` | This value cannot be `null`. <br /> |

### getInstance

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static MediaRouter2 getInstance (Context context, 
                String clientPackageName, 
                Executor executor, 
                Runnable onInstanceInvalidatedListener)
```

Returns a proxy MediaRouter2 instance that allows you to control the routing of an app
specified by `clientPackageName`.

Proxy MediaRouter2 instances operate differently than regular MediaRouter2 instances:

- `https://developer.android.com/reference/android/media/MediaRouter2#registerRouteCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.RouteCallback,%20android.media.RouteDiscoveryPreference)` ignores any `https://developer.android.com/reference/android/media/RouteDiscoveryPreference` passed by a proxy router. Use `https://developer.android.com/` when
  setting a route callback.

- Methods returning non-system `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` always return new
  instances with the latest data. Do not attempt to compare or store them. Instead, use
  `https://developer.android.com/reference/android/media/MediaRouter2#getController(java.lang.String)` or `https://developer.android.com/reference/android/media/MediaRouter2#getControllers()` to query the most
  up-to-date state.

- Calls to `https://developer.android.com/reference/android/media/MediaRouter2#setOnGetControllerHintsListener(android.media.MediaRouter2.OnGetControllerHintsListener)` are ignored.

Use this method when you only hold a revocable version of `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL` (e.g. acquired via the `https://developer.android.com/reference/android/app/AppOpsManager`).
Otherwise, use `https://developer.android.com/`.

`onInstanceInvalidatedListener` is called when the instance is invalidated because
the calling app has lost `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL` and does not hold
`https://developer.android.com/reference/android/Manifest.permission#MEDIA_CONTENT_CONTROL`. Do not use the invalidated instance after
receiving this callback, as the system will ignore all operations. Call `https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context,%20java.lang.String,%20java.util.concurrent.Executor,%20java.lang.Runnable)` again after reacquiring the relevant
permissions.


Requires `https://developer.android.com/reference/android/Manifest.permission#MEDIA_CONTENT_CONTROL` or `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL`

<br />

| Parameters ||
|---|---|
| `context` | `Context`: The `https://developer.android.com/reference/android/content/Context` of the caller. This value cannot be `null`. <br /> |
| `clientPackageName` | `String`: The package name of the app you want to control the routing of, or `"android"` to control the routing of the whole system. This value cannot be `null`. <br /> |
| `executor` | `Executor`: The `https://developer.android.com/reference/java/util/concurrent/Executor` on which to invoke `onInstanceInvalidatedListener`. This value cannot be `null`. <br /> |
| `onInstanceInvalidatedListener` | `Runnable`: Callback for when the `https://developer.android.com/reference/android/media/MediaRouter2` instance is invalidated due to lost permissions. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/MediaRouter2` | This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if `clientPackageName` does not exist in the calling user. |

### getRouteListingPreference

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public RouteListingPreference getRouteListingPreference ()
```

Returns the current `https://developer.android.com/reference/android/media/RouteListingPreference` of the target router.

If this instance was created using `#getInstance(Context, String)`, then it returns
the last `https://developer.android.com/reference/android/media/RouteListingPreference` set by the process this router was created for.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/RouteListingPreference` | This value may be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#setRouteListingPreference(android.media.RouteListingPreference)`

### getRoutes

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public List<MediaRoute2Info> getRoutes ()
```

Gets the unmodifiable list of `https://developer.android.com/reference/android/media/MediaRoute2Info` currently known to the media
router.

Please note that the list can be changed before callbacks are invoked.

This method returns routes available to the routing framework that contain at least one of
the `https://developer.android.com/reference/android/media/RouteDiscoveryPreference#getPreferredFeatures()` registered by the
application through `https://developer.android.com/reference/android/media/MediaRouter2#registerRouteCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.RouteCallback,%20android.media.RouteDiscoveryPreference)`. As a result, you need to register at
least one `https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback` (associated with the features that you are interested in), in
order for this method to return a non-empty list.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/MediaRoute2Info>` | the list of routes that contains at least one of the route features in discovery preferences registered by the application. This value cannot be `null`. <br /> |

### getSystemController

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public MediaRouter2.RoutingController getSystemController ()
```

Gets a `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` which can control the routes provided by system.
e.g. Phone speaker, wired headset, Bluetooth, etc.

Note: The system controller can't be released. Calling `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController#release()`
will be ignored.

This method always returns the same instance.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` | This value cannot be `null`. <br /> |

### registerControllerCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void registerControllerCallback (Executor executor, 
                MediaRouter2.ControllerCallback callback)
```

Registers a `https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback`. If you register the same callback twice or more, it
will be ignored.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `callback` | `MediaRouter2.ControllerCallback`: This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#unregisterControllerCallback(android.media.MediaRouter2.ControllerCallback)`

### registerDeviceSuggestionsUpdatesCallback

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public void registerDeviceSuggestionsUpdatesCallback (Executor executor, 
                MediaRouter2.DeviceSuggestionsUpdatesCallback deviceSuggestionsUpdatesCallback)
```

Registers the given callback to be invoked when the `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` of the target
router changes.

Calls using a previously registered callback will overwrite the previous executor.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `deviceSuggestionsUpdatesCallback` | `MediaRouter2.DeviceSuggestionsUpdatesCallback`: This value cannot be `null`. <br /> |

### registerRouteCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void registerRouteCallback (Executor executor, 
                MediaRouter2.RouteCallback routeCallback, 
                RouteDiscoveryPreference preference)
```

Registers a callback to discover routes and to receive events when they change.

Clients can register multiple callbacks, as long as the `https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback` instances
are different. Each callback can provide a unique `https://developer.android.com/reference/android/media/RouteDiscoveryPreference`
and will only receive updates related to that set preference.

If the specified callback is already registered, its registration will be updated for the
given `https://developer.android.com/reference/java/util/concurrent/Executor` and `https://developer.android.com/reference/android/media/RouteDiscoveryPreference`.

`https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context)` must register a route callback to register in
the system and start receiving updates. Otherwise, all operations will be no-ops.

Any discovery preference passed by a `https://developer.android.com/`
will be ignored and will receive route updates based on the preference set by its matching
local router.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `routeCallback` | `MediaRouter2.RouteCallback`: This value cannot be `null`. <br /> |
| `preference` | `RouteDiscoveryPreference`: This value cannot be `null`. <br /> |

### registerRouteListingPreferenceUpdatedCallback

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void registerRouteListingPreferenceUpdatedCallback (Executor executor, 
                Consumer<RouteListingPreference> routeListingPreferenceCallback)
```

Registers the given callback to be invoked when the `https://developer.android.com/reference/android/media/RouteListingPreference` of the
target router changes.

Calls using a previously registered callback will overwrite the previous executor.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `routeListingPreferenceCallback` | `Consumer`: This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#setRouteListingPreference(android.media.RouteListingPreference)`

### registerTransferCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void registerTransferCallback (Executor executor, 
                MediaRouter2.TransferCallback callback)
```

Registers a callback to get the result of `https://developer.android.com/reference/android/media/MediaRouter2#transferTo(android.media.MediaRoute2Info)`.
If you register the same callback twice or more, it will be ignored.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: the executor to execute the callback on. This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `callback` | `MediaRouter2.TransferCallback`: the callback to register. This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#unregisterTransferCallback(android.media.MediaRouter2.TransferCallback)`

### requestScan

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public MediaRouter2.ScanToken requestScan (MediaRouter2.ScanRequest scanRequest)
```

Requests the system to actively scan for routes based on the router's `https://developer.android.com/reference/android/media/RouteDiscoveryPreference`.

You must call `https://developer.android.com/reference/android/media/MediaRouter2#cancelScanRequest(android.media.MediaRouter2.ScanToken)` promptly to preserve system resources
like battery. Avoid scanning unless there is clear intention from the user to start routing
their media.

`scanRequest` specifies relevant scanning options, like whether the system should
scan with the screen off. Screen off scanning requires `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL` or `https://developer.android.com/reference/android/Manifest.permission#MEDIA_CONTENT_CONTROL`.

Proxy routers use the registered `https://developer.android.com/reference/android/media/RouteDiscoveryPreference` of their target routers.

<br />

| Parameters ||
|---|---|
| `scanRequest` | `MediaRouter2.ScanRequest`: This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken` | A unique `https://developer.android.com/reference/android/media/MediaRouter2.ScanToken` that identifies the scan request. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/SecurityException` | If a `https://developer.android.com/reference/android/media/MediaRouter2.ScanRequest` with `https://developer.android.com/reference/android/media/MediaRouter2.ScanRequest.Builder#setScreenOffScan(boolean)` true is passed, while not holding `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL` or `https://developer.android.com/reference/android/Manifest.permission#MEDIA_CONTENT_CONTROL`. |

### setDeviceSuggestions

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public void setDeviceSuggestions (List<SuggestedDeviceInfo> suggestedDeviceInfo)
```

Sets a list of `https://developer.android.com/reference/android/media/SuggestedDeviceInfo`.

Use this method to tell the system about device suggestions for the current router. The
system may use these suggestions to populate system UI such as Output Switcher and media
controls.

Suggestions will be expired automatically by the system, at which point you should call
this method again if the suggestion is still relevant and should still be surfaced.

<br />

| Parameters ||
|---|---|
| `suggestedDeviceInfo` | `List`: The `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` the router suggests should be provided to the user. This value cannot be `null`. <br /> |

### setOnGetControllerHintsListener

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setOnGetControllerHintsListener (MediaRouter2.OnGetControllerHintsListener listener)
```

Sets an `https://developer.android.com/reference/android/media/MediaRouter2.OnGetControllerHintsListener` to send hints when creating a
`https://developer.android.com/reference/android/media/MediaRouter2.RoutingController`. To send the hints, listener should be set *BEFORE* calling
`https://developer.android.com/reference/android/media/MediaRouter2#transferTo(android.media.MediaRoute2Info)`.

<br />

| Parameters ||
|---|---|
| `listener` | `MediaRouter2.OnGetControllerHintsListener`: A listener to send optional app-specific hints when creating a controller. `null` for unset. <br /> |

### setRouteListingPreference

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setRouteListingPreference (RouteListingPreference routeListingPreference)
```

Sets the `https://developer.android.com/reference/android/media/RouteListingPreference` of the app associated to this media router.

Use this method to inform the system UI of the routes that you would like to list for
media routing, via the Output Switcher.

You should call this method before `https://developer.android.com/reference/android/media/MediaRouter2#registerRouteCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.RouteCallback,%20android.media.RouteDiscoveryPreference)` and immediately after receiving any `https://developer.android.com/reference/android/media/MediaRouter2.RouteCallback#onRoutesUpdated(java.util.List<android.media.MediaRoute2Info>)` in order to keep the system UI in a consistent state. You can also call this method
at any other point to update the listing preference dynamically.

Calling this method on a proxy router instance will throw an `https://developer.android.com/reference/java/lang/UnsupportedOperationException`.

Notes:

1. You should not include the ids of two or more routes with a match in their `https://developer.android.com/reference/android/media/MediaRoute2Info#getDeduplicationIds()`. If you do, the system will deduplicate them using its own criteria.
2. You can use this method to rank routes in the output switcher, placing the more important routes first. The system might override the proposed ranking.
3. You can use this method to avoid listing routes using dynamic criteria. For example, you can limit access to a specific type of device according to runtime criteria.

<br />

<br />

| Parameters ||
|---|---|
| `routeListingPreference` | `RouteListingPreference`: The `https://developer.android.com/reference/android/media/RouteListingPreference` for the system to use for route listing. When null, the system uses its default listing criteria. <br /> |

### setRouteVolume

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setRouteVolume (MediaRoute2Info route, 
                int volume)
```

Sets the volume for a specific route.

The call may have no effect if the route is currently not selected.

This method is only supported by `https://developer.android.com/`. Use `https://developer.android.com/reference/android/media/MediaRouter2.RoutingController#setVolume(int)`
instead for `https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context)`.
.   
Requires `https://developer.android.com/reference/android/Manifest.permission#MEDIA_CONTENT_CONTROL` or `https://developer.android.com/reference/android/Manifest.permission#MEDIA_ROUTING_CONTROL`

<br />

<br />

| Parameters ||
|---|---|
| `route` | `MediaRoute2Info`: This value cannot be `null`. <br /> |
| `volume` | `int`: The new volume value between 0 and `https://developer.android.com/reference/android/media/MediaRoute2Info#getVolumeMax()`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/UnsupportedOperationException` | If called on a `https://developer.android.com/reference/android/media/MediaRouter2#getInstance(android.content.Context)`. |

### showSystemOutputSwitcher

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public boolean showSystemOutputSwitcher (MediaSession.Token sessionToken)
```

Shows the system output switcher dialog for a specific `https://developer.android.com/reference/android/media/session/MediaSession`.

The `https://developer.android.com/reference/android/media/session/MediaSession.Token` argument allows the system to identify which
`https://developer.android.com/reference/android/media/RoutingSessionInfo` to display as active. This is done via
`https://developer.android.com/reference/android/media/session/MediaSession#setPlaybackToRemote(android.media.VolumeProvider)` and `https://developer.android.com/reference/android/media/VolumeProvider#getVolumeControlId()` when
playing remotely, and `https://developer.android.com/reference/android/media/session/MediaSession#setPlaybackToLocal(android.media.AudioAttributes)` when playing on this device.

This method is preferred over `https://developer.android.com/reference/android/media/MediaRouter2#showSystemOutputSwitcher()` to prevent the system
from making wrong inferences about where playback is happening.

<br />

| Parameters ||
|---|---|
| `sessionToken` | `MediaSession.Token`: This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `boolean` | `true` if the output switcher dialog is being shown, or `false` if the call is ignored because the app is in the background. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if the provided `sessionToken` is invalid. |

### showSystemOutputSwitcher

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean showSystemOutputSwitcher ()
```

Shows the system output switcher dialog.

Should only be called when the context of MediaRouter2 is in the foreground and visible on
the screen.

The appearance and precise behaviour of the system output switcher dialog may vary across
different devices, OS versions, and form factors, but the basic functionality stays the same.

See [Output
Switcher documentation](https://developer.android.com/guide/topics/media/media-routing#output-switcher) for more details.

<br />

| Returns ||
|---|---|
| `boolean` | `true` if the output switcher dialog is being shown, or `false` if the call is ignored because the app is in the background. <br /> |

### stop

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void stop ()
```

Stops the current media routing. If the `https://developer.android.com/reference/android/media/MediaRouter2#getSystemController()`
controls the media routing, this method is a no-op.

<br />

### transferTo

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void transferTo (MediaRoute2Info route)
```

Transfers the current media to the given route. If it's necessary a new
`https://developer.android.com/reference/android/media/MediaRouter2.RoutingController` is created or it is handled within the current routing controller.

<br />

| Parameters ||
|---|---|
| `route` | `MediaRoute2Info`: the route you want to transfer the current media to. This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2.TransferCallback#onTransfer(android.media.MediaRouter2.RoutingController,%20android.media.MediaRouter2.RoutingController)`
- `https://developer.android.com/reference/android/media/MediaRouter2.TransferCallback#onTransferFailure(android.media.MediaRoute2Info)`

### unregisterControllerCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterControllerCallback (MediaRouter2.ControllerCallback callback)
```

Unregisters a `https://developer.android.com/reference/android/media/MediaRouter2.ControllerCallback`. The callback will no longer receive events.
If the callback has not been added or been removed already, it is ignored.

<br />

| Parameters ||
|---|---|
| `callback` | `MediaRouter2.ControllerCallback`: This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#registerControllerCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.ControllerCallback)`

### unregisterDeviceSuggestionsUpdatesCallback

Added in [version 36.1](https://developer.android.com/topic/libraries/support-library/revisions)

```
public void unregisterDeviceSuggestionsUpdatesCallback (MediaRouter2.DeviceSuggestionsUpdatesCallback callback)
```

Unregisters the given callback to not receive `https://developer.android.com/reference/android/media/SuggestedDeviceInfo` change events.

<br />

| Parameters ||
|---|---|
| `callback` | `MediaRouter2.DeviceSuggestionsUpdatesCallback`: This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#registerDeviceSuggestionsUpdatesCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.DeviceSuggestionsUpdatesCallback)`

### unregisterRouteCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterRouteCallback (MediaRouter2.RouteCallback routeCallback)
```

Unregisters the given callback. The callback will no longer receive events. If the callback
has not been added or been removed already, it is ignored.

<br />

| Parameters ||
|---|---|
| `routeCallback` | `MediaRouter2.RouteCallback`: the callback to unregister. This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#registerRouteCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.RouteCallback,%20android.media.RouteDiscoveryPreference)`

### unregisterRouteListingPreferenceUpdatedCallback

Added in [API level 35](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterRouteListingPreferenceUpdatedCallback (Consumer<RouteListingPreference> callback)
```

Unregisters the given callback to not receive `https://developer.android.com/reference/android/media/RouteListingPreference` change events.

<br />

| Parameters ||
|---|---|
| `callback` | `Consumer`: This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#registerRouteListingPreferenceUpdatedCallback(java.util.concurrent.Executor,%20java.util.function.Consumer<android.media.RouteListingPreference>)`

### unregisterTransferCallback

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterTransferCallback (MediaRouter2.TransferCallback callback)
```

Unregisters the given callback. The callback will no longer receive events.
If the callback has not been added or been removed already, it is ignored.

<br />

| Parameters ||
|---|---|
| `callback` | `MediaRouter2.TransferCallback`: the callback to unregister. This value cannot be `null`. <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/MediaRouter2#registerTransferCallback(java.util.concurrent.Executor,%20android.media.MediaRouter2.TransferCallback)`