# MediaRouteProvider

Artifact: [androidx.mediarouter:mediarouter](https://developer.android.com/jetpack/androidx/releases/mediarouter) [View Source](https://cs.android.com/search?q=file:androidx/mediarouter/media/MediaRouteProvider.java+class:androidx.mediarouter.media.MediaRouteProvider) Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

*** ** * ** ***


```
public abstract class MediaRouteProvider
```

<br />

*** ** * ** ***

Media route providers are used to publish additional media routes for use within an application. Media route providers may also be declared as a service to publish additional media routes to all applications in the system.

The purpose of a media route provider is to discover media routes that satisfy the criteria specified by the current `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` and publish a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor` with information about each route by calling `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setDescriptor(androidx.mediarouter.media.MediaRouteProviderDescriptor)` to notify the currently registered `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback`.

The provider should watch for changes to the discovery request by implementing `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest)` and updating the set of routes that it is attempting to discover. It should also handle route control requests such as volume changes or `https://developer.android.com/reference/androidx/mediarouter/media/MediaControlIntent` by implementing `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)` to return a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` for a particular route.

A media route provider can support `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor#supportsDynamicGroupRoute()` that allows the user to add or remove a route from the selected route dynamically. To control dynamic group, `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` returned by `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateDynamicGroupRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)` is used instead of `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController`.

A media route provider may be used privately within the scope of a single application process by calling `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter#addProvider(androidx.mediarouter.media.MediaRouteProvider)` to add it to the local `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter`. A media route provider may also be made available globally to all applications by registering a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderService` in the provider's manifest. When the media route provider is registered as a service, all applications that use the media router API will be able to discover and used the provider's routes without having to install anything else.

This object must only be accessed on the main thread.

## Summary

| ### Nested types |
|---|
| `public abstract class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback` Callback which is invoked when route information becomes available or changes. |
| `public abstract class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController extends https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` Provides control over a dynamic group route. |
| `public final class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor` Contains a route, its selection state and its capabilities. |
| `public final class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor.Builder` Builder for `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor` |
| `public final class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.ProviderMetadata` Describes properties of the route provider's implementation. |
| `public abstract class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` Provides control over a particular route. |
| `public final class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions` Holds parameters for creating `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController`. |
| `public final class https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions.Builder` Builder for `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions`. |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#MediaRouteProvider(android.content.Context)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/Context.html context)` Creates a media route provider. |

| ### Public methods |
|---|---|
| `final @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/Context.html` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#getContext()()` Gets the context of the media route provider. |
| `final @https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#getDescriptor()()` Gets the provider's descriptor. |
| `final @https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#getDiscoveryRequest()()` Gets the current discovery request which informs the provider about the kinds of routes to discover and whether to perform active scanning. |
| `final @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/os/Handler.html` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#getHandler()()` Gets the provider's handler which is associated with the main thread. |
| `final @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.ProviderMetadata` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#getMetadata()()` Gets some metadata about the provider's implementation. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateDynamicGroupRouteController(java.lang.String)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html initialMemberRouteId )` Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateDynamicGroupRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html initialMemberRouteId, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions routeControllerOptions )` Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateRouteController(java.lang.String)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html routeId)` Called by the media router to obtain a route controller for a particular route. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)( @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html routeId, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions routeControllerOptions )` Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController`. |
| `void` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest)(@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest request)` Called by the media router when the `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` has changed. |
| `final void` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setCallback(androidx.mediarouter.media.MediaRouteProvider.Callback)(@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback callback)` Sets a callback to invoke when the provider's descriptor changes. |
| `final void` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setDescriptor(androidx.mediarouter.media.MediaRouteProviderDescriptor)(@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor descriptor)` Sets the provider's descriptor. |
| `final void` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setDiscoveryRequest(androidx.mediarouter.media.MediaRouteDiscoveryRequest)(@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest request)` Sets a discovery request to inform the provider about the kinds of routes that its clients would like to discover and whether to perform active scanning. |

## Public constructors

### MediaRouteProvider

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public MediaRouteProvider(@NonNull Context context)
```

Creates a media route provider.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/android/content/Context.html context` | The context. |

## Public methods

### getContext

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final @NonNull Context getContext()
```

Gets the context of the media route provider.

### getDescriptor

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final @Nullable MediaRouteProviderDescriptor getDescriptor()
```

Gets the provider's descriptor.

The descriptor describes the state of the media route provider and the routes that it publishes. Watch for changes to the descriptor by registering a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback` with `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setCallback(androidx.mediarouter.media.MediaRouteProvider.Callback)`.

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor` | The media route provider descriptor, or null if none. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback#onDescriptorChanged(androidx.mediarouter.media.MediaRouteProvider,androidx.mediarouter.media.MediaRouteProviderDescriptor)` |   |

### getDiscoveryRequest

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final @Nullable MediaRouteDiscoveryRequest getDiscoveryRequest()
```

Gets the current discovery request which informs the provider about the kinds of routes to discover and whether to perform active scanning.

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` | The current discovery request, or null if no discovery is needed at this time. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest)` |   |

### getHandler

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final @NonNull Handler getHandler()
```

Gets the provider's handler which is associated with the main thread.

### getMetadata

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final @NonNull MediaRouteProvider.ProviderMetadata getMetadata()
```

Gets some metadata about the provider's implementation.

### onCreateDynamicGroupRouteController

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public @Nullable MediaRouteProvider.DynamicGroupRouteController onCreateDynamicGroupRouteController(
    @NonNull String initialMemberRouteId
)
```

Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`.

It is equivalent to `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateDynamicGroupRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)`, except it doesn't take `RouteControllerOptions`.

This method is only called when the subclass doesn't implement `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onCreateDynamicGroupRouteController(java.lang.String,androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions)`.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html initialMemberRouteId` | initially selected route's id. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`. Returns null if there is no such route or if the route cannot be controlled using the `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` interface. |

### onCreateDynamicGroupRouteController

Added in [1.8.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.8.0)

```
public @Nullable MediaRouteProvider.DynamicGroupRouteController onCreateDynamicGroupRouteController(
    @NonNull String initialMemberRouteId,
    @NonNull MediaRouteProvider.RouteControllerOptions routeControllerOptions
)
```

Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`.

It will be called from an app or `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter` when a single route or a single static group is selected.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html initialMemberRouteId` | initially selected route's id. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions routeControllerOptions` | the parameters to be used to create the route controller. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController`. Returns null if there is no such route or if the route cannot be controlled using the `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.DynamicGroupRouteController` interface. |

### onCreateRouteController

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public @Nullable MediaRouteProvider.RouteController onCreateRouteController(@NonNull String routeId)
```

Called by the media router to obtain a route controller for a particular route.

The media router will invoke the `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController#onRelease()` method of the route controller when it is no longer needed to allow it to free its resources.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html routeId` | The unique id of the route. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` | The route controller. Returns null if there is no such route or if the route cannot be controlled using the route controller interface. |

### onCreateRouteController

Added in [1.8.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.8.0)

```
public @Nullable MediaRouteProvider.RouteController onCreateRouteController(
    @NonNull String routeId,
    @NonNull MediaRouteProvider.RouteControllerOptions routeControllerOptions
)
```

Creates a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController`.

It will be called from an app or `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter` when a single route is selected.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/java/lang/String.html routeId` | the selected route's ID. |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteControllerOptions routeControllerOptions` | the parameters to be used to create the route controller. |

| Returns |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController` | `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.RouteController`. Returns null if there is no such route. |

### onDiscoveryRequestChanged

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public void onDiscoveryRequestChanged(@Nullable MediaRouteDiscoveryRequest request)
```

Called by the media router when the `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` has changed.

Whenever an applications calls `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter#addCallback(androidx.mediarouter.media.MediaRouteSelector,androidx.mediarouter.media.MediaRouter.Callback)` to register a callback, it also provides a selector to specify the kinds of routes that it is interested in. The media router combines all of these selectors together to generate a `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest` and notifies each provider when a change occurs by calling `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#setDiscoveryRequest(androidx.mediarouter.media.MediaRouteDiscoveryRequest)` which posts a message to invoke this method asynchronously.

The provider should examine the `https://developer.android.com/reference/androidx/mediarouter/media/MediaControlIntent` in the discovery request's `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteSelector` to determine what kinds of routes it should try to discover and whether it should perform active or passive scans. In many cases, the provider may be able to save power by determining that the selector does not contain any categories that it supports and it can therefore avoid performing any scans at all.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest request` | The new discovery request, or null if no discovery is needed at this time. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouter#addCallback(androidx.mediarouter.media.MediaRouteSelector,androidx.mediarouter.media.MediaRouter.Callback)` |   |

### setCallback

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final void setCallback(@Nullable MediaRouteProvider.Callback callback)
```

Sets a callback to invoke when the provider's descriptor changes.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback callback` | The callback to use, or null if none. |

### setDescriptor

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final void setDescriptor(@Nullable MediaRouteProviderDescriptor descriptor)
```

Sets the provider's descriptor.

The provider must call this method to notify the currently registered `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback` about the change to the provider's descriptor.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProviderDescriptor descriptor` | The updated route provider descriptor, or null if none. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider.Callback#onDescriptorChanged(androidx.mediarouter.media.MediaRouteProvider,androidx.mediarouter.media.MediaRouteProviderDescriptor)` |   |

### setDiscoveryRequest

Added in [1.1.0](https://developer.android.com/jetpack/androidx/releases/mediarouter#1.1.0)

```
public final void setDiscoveryRequest(@Nullable MediaRouteDiscoveryRequest request)
```

Sets a discovery request to inform the provider about the kinds of routes that its clients would like to discover and whether to perform active scanning.

| Parameters |
|---|---|
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteDiscoveryRequest request` | The discovery request, or null if no discovery is needed at this time. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/mediarouter/media/MediaRouteProvider#onDiscoveryRequestChanged(androidx.mediarouter.media.MediaRouteDiscoveryRequest)` |   |