155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpage.title=Media Route Provider
255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpage.tags="mediarouteprovider","mediacontrolintent"
355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez@jd:body
455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<div id="qv-wrapper">
655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <div id="qv">
755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <h2>In this document</h2>
855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <ol>
955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li><a href="#overview">Overview</a>
1055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        <ol>
1155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#dist">Distribution of route providers</a></li>
1255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#playback-types">Types of playback</a></li>
1355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#mr-packages">Media router packages</a></li>
1455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        </ol>
1555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      </li>
1655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li><a href="#provider-service">Creating a Provider Service</a></li>
1755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li><a href="#route-caps">Specifying Route Capabilities</a>
1855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        <ol>
1955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#route-cat">Route categories</a></li>
2055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#media-types">Media types and protocols</a></li>
2155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#playback-ctrls">Playback controls</a></li>
2255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez          <li><a href="#mrpd">MediaRouteProviderDescriptor</a></li>
2355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        </ol>
2455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      </li>
2555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li><a href="#ctrl-routes">Controlling Routes</a></li>
2655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    </ol>
2755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <h2>Key Classes</h2>
2855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <ol>
2955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li>{@link android.support.v7.media.MediaRouteProvider}</li>
3055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li>{@link android.support.v7.media.MediaRouteProviderDescriptor}</li>
3155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li>{@link android.support.v7.media.MediaRouteProvider.RouteController RouteController}</li>
3255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    </ol>
3355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <h2>Related Samples</h2>
3455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <ol>
3555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez      <li><a href="{@docRoot}samples/MediaRouter/index.html">MediaRouter</a></li>
3655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    </ol>
3755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  </div>
3855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</div>
3955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
4055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>Users want to play media content from their Android devices bigger, brighter, and louder on
4155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  connected playback devices such as televisions, stereos,
4255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  and home theater equipment. As a manufacturer of these devices, allowing Android users to
4355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  instantly show a picture, play a song, or share a video for friends and family using your product
4455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  can make it much more compelling and engaging.</p>
4555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
4655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The Android media router framework allows manufacturers to enable playback on their devices
4755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  through a standardized interface called a {@link android.support.v7.media.MediaRouteProvider}.
4855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  A route provider defines a common interface for playing media on a receiver device, making it
4955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  possible to play media on your equipment from any Android application that supports media
5055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  routes.</p>
5155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
5255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>This guide discusses how to create a media route provider for a receiver device and make it
5355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  available to other media playback applications that run on Android.</p>
5455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
5555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h2 id="overview">Overview</h2>
5655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
5755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The Android media router framework enables media app developers and media playback device
5855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  manufacturers to connect through a common API and common user interface. App developers that
5955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  implement a {@link android.support.v7.media.MediaRouter} interface can then connect to the
6055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  framework and play content to devices that participate in the media router framework. Media
6155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  playback device manufacturers can participate in the framework by publishing a {@link
6255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider} that allows other applications to connect to and
6355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  play media on the receiver devices. Figure 1 illustrates how an app connects to a receiving
6455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  device through the media router framework.</p>
6555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
6655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<img src="{@docRoot}images/mediarouter/media-route-provider-framework.png" alt="" id="figure1"/>
6755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p class="img-caption">
6855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <strong>Figure 1.</strong> Overview of how media route provider classes provide communication
6955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  from a media app to a receiver device.
7055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</p>
7155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
7255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>When you build a media route provider for your receiver device, the provider serves the
7355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezfollowing purposes:</p>
7455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
7555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<ul>
7655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>Describe and publish the capabilities of the receiver device so other apps can discover it
7755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    and use its playback features.</li>
7855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>Wrap the programming interface of the receiver device and its communication
7955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    transport mechanisms to make the device compatible with the media router framework.</li>
8055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</ul>
8155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
8255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
8355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="dist">Distribution of route providers</h3>
8455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
8555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>A media route provider is distributed as part of an Android app. Your route provider can be
8655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  made available to other apps by extending
8755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaRouteProviderService} or wrapping your implementation of
8855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaRouteProvider} with your own service and declaring an intent
8955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  filter for the media route provider. These steps allow other apps to discover and make use of
9055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  your media route.</p>
9155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
9255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>
9355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <strong>Note:</strong> The app containing the media route provider can also include a
9455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <a href="{@docRoot}guide/topics/media/mediarouter.html">MediaRouter</a> interface to the
9555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  route provider, but this is not required.
9655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</p>
9755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
9855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
9955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="playback-types">Types of playback</h3>
10055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
10155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>There are two main types of playback supported by the media router framework. A media route
10255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  provider can support one or both types of playback, depending on the capabilities of your playback
10355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  equipment and the functionality you want to support:</p>
10455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
10555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<ul>
10655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li><strong>Remote Playback</strong> — This approach uses the receiver device to handle the
10755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    content data retrieval, decoding, and playback, while an Android device in the user's hand is
10855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    used as a remote control. This approach is used by Android apps that support
10955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <a href="https://developers.google.com/cast/">Google Cast</a>.</li>
11055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li><strong>Secondary Output</strong> — With this approach, the Android media application
11155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    retrieves, renders and streams video or music directly to the receiver device. This approach is
11255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    used to support Wireless Display output on Android.</li>
11355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</ul>
11455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
11555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
11655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="mr-packages">Media router packages</h3>
11755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
11855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>
11955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  The media router APIs are provided as part of the Android Support Library version 18 and higher,
12055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  in the <a href="{@docRoot}tools/support-library/features.html#v7-mediarouter">v7-mediarouter</a>
12155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  support library. You should use the classes in the
12255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media} package for media route provider functions.
12355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  These APIs are compatible with devices running Android 2.1 (API level 7) and higher.
12455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</p>
12555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
12655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p class="caution">
12755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <strong>Caution:</strong> There is another set of media router APIs provided in the
12855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.media} class package that have been superseded by the
12955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <a href="{@docRoot}tools/support-library/features.html#v7-mediarouter">v7-mediarouter</a>
13055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  support library. You <em>should not</em> use the {@link android.media} classes for
13155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  implementing media route provider functions.
13255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</p>
13355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
13455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>In order to use the {@link android.support.v7.media} media router classes, you
13555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  must add the <a href="{@docRoot}tools/support-library/features.html#v7-mediarouter"
13655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  >v7-mediarouter support library package</a> to your app development project. For more
13755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  information on adding support libraries to your app development project, see
13855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <a href="{@docRoot}tools/support-library/setup.html">Support Library Setup</a>.
13955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</p>
14055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
14155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
14255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h2 id="provider-service">Creating a Provider Service</h2>
14355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
14455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The media router framework must be able to discover and connect to your media route provider
14555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  to allow other applications to use your route. In order to do this, the media router framework
14655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  looks for apps that declare a media route provider intent action. When another app wants to
14755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  connect to your provider, the framework must be able to invoke and connect to it, so your provider
14855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  must be encapsulated in a {@link android.app.Service}.</p>
14955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
15055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The following example code shows the declaration of a media route provider service and the
15155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  intent filter in a manifest, which allows it to be discovered and used by the media router
15255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  framework:</p>
15355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
15455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
15555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez&lt;service android:name=".provider.SampleMediaRouteProviderService"
15655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    android:label="&#64;string/sample_media_route_provider_service"
15755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    android:process=":mrp"&gt;
15855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &lt;intent-filter&gt;
15955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        &lt;action android:name="android.media.MediaRouteProviderService" /&gt;
16055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &lt;/intent-filter&gt;
16155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez&lt;/service&gt;
16255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
16355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
16455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>This manifest example declares a service that wraps the actual media route provider classes.
16555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  The Android media router framework provides the
16655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaRouteProviderService} class for use as a service wrapper for
16755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  media route providers. The following example code demonstrates how to use this wrapper
16855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  class:</p>
16955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
17055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
17155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpublic class SampleMediaRouteProviderService extends MediaRouteProviderService {
17255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
17355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &#64;Override
17455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    public MediaRouteProvider onCreateMediaRouteProvider() {
17555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        return new SampleMediaRouteProvider(this);
17655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
17755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
17855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
17955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
18055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
18155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h2 id="route-caps">Specifying Route Capabilities</h2>
18255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
18355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>Apps connecting to the media router framework can discover your media route through your
18455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  app's manifest declarations, but they also need to know the capabilities of the media routes you
18555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  are providing. Media routes can be of different types and have different features, and other apps
18655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  need to be able to discover these details to determine if they are compatible with your route.</p>
18755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
18855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The media router framework allows you to define and publish the capabilities of your media
18955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  route through {@link android.content.IntentFilter} objects, {@link
19055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteDescriptor} objects and a {@link
19155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProviderDescriptor}. This section explains how to use these
19255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  classes to publish the details of your media route for other apps.</p>
19355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
19455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
19555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="route-cat">Route categories</h3>
19655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
19755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>As part of the programmatic description of your media route provider, you must specify
19855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  whether your provider supports remote playback, secondary output, or both. These are the route
19955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  categories provided by the media router framework:</p>
20055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
20155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<ul>
20255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaControlIntent#CATEGORY_LIVE_AUDIO CATEGORY_LIVE_AUDIO}
20355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &mdash; Output of audio to a secondary output device, such as a wireless-enabled music system.
20455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    </li>
20555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaControlIntent#CATEGORY_LIVE_VIDEO CATEGORY_LIVE_VIDEO}
20655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &mdash; Output of video to a secondary output device, such as Wireless Display devices.</li>
20755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaControlIntent#CATEGORY_REMOTE_PLAYBACK
20855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    CATEGORY_REMOTE_PLAYBACK} &mdash; Play video or audio on a separate device which handles media
20955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    retrieval, decoding, and playback, such as
21055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    <a href="https://www.google.com/url?q=http://www.google.com/chromecast">Chromecast</a> devices.
21155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    </li>
21255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</ul>
21355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
21455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>In order to include these settings in a description of your media route, you insert them into
21555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  an {@link android.content.IntentFilter} object, which you later add to a
21655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaRouteDescriptor} object:</p>
21755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
21855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
21955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpublic final class SampleMediaRouteProvider extends MediaRouteProvider {
22055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    private static final ArrayList&lt;IntentFilter&gt; CONTROL_FILTERS_BASIC;
22155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    static {
22255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        IntentFilter videoPlayback = new IntentFilter();
22355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        <strong>videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);</strong>
22455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC = new ArrayList&lt;IntentFilter&gt;();
22555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC.add(videoPlayback);
22655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
22755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
22855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
22955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
23055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
23155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>If you specify the {@link android.support.v7.media.MediaControlIntent#CATEGORY_REMOTE_PLAYBACK
23255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  CATEGORY_REMOTE_PLAYBACK} intent, you must also define what media types and
23355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  playback controls are supported by your media route provider. The next section describes how to
23455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  specify these settings for your device.</p>
23555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
23655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
23755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="media-types">Media types and protocols</h3>
23855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
23955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>A media route provider for a remote playback device must specify the media types and transfer
24055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  protocols it supports. You specify these settings using the {@link android.content.IntentFilter}
24155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  class and the {@link android.content.IntentFilter#addDataScheme addDataScheme()} and
24255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.content.IntentFilter#addDataType addDataType()} methods of that object. The
24355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  following code snippet demonstrates how to define an intent filter for supporting remote video
24455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  playback using http, https, and Real Time Streaming Protocol (RTSP):</p>
24555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
24655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
24755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpublic final class SampleMediaRouteProvider extends MediaRouteProvider {
24855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
24955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    private static final ArrayList&lt;IntentFilter&gt; CONTROL_FILTERS_BASIC;
25055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
25155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    static {
25255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        IntentFilter videoPlayback = new IntentFilter();
25355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
25455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        videoPlayback.addAction(MediaControlIntent.ACTION_PLAY);
25555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        videoPlayback.addDataScheme("http");
25655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        videoPlayback.addDataScheme("https");
25755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        videoPlayback.addDataScheme("rtsp");
25855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        addDataTypeUnchecked(videoPlayback, "video/*");
25955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC = new ArrayList&lt;IntentFilter&gt;();
26055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC.add(videoPlayback);
26155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
26255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    ...
26355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
26455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    private static void addDataTypeUnchecked(IntentFilter filter, String type) {
26555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        try {
26655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            filter.addDataType(type);
26755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        } catch (MalformedMimeTypeException ex) {
26855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            throw new RuntimeException(ex);
26955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        }
27055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
27155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
27255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
27355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
27455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
27555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
27655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="playback-ctrls">Playback controls</h3>
27755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
27855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>A media route provider that offers remote playback must specify the types of media controls
27955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  it supports. These are the general types of control that media routes can provide:</p>
28055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
28155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<ul>
28255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li><strong>Playback controls</strong>, such as play, pause, rewind, and fast-forward.</li>
28355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li><strong>Queuing features</strong>, which allow the sending app to add and remove items
28455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    from a playlist which is maintained by the receiver device.</li>
28555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li><strong>Session features</strong>, which prevent sending apps from interfering with each
28655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    other by having the receiver device provide a session id to the requesting app and then checking
28755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    that id with each subsequent playback control request.</li>
28855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</ul>
28955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
29055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The following code example demonstrates how to construct an intent filter for supporting
29155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  basic media route playback controls:</p>
29255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
29355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
29455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpublic final class SampleMediaRouteProvider extends MediaRouteProvider {
29555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    private static final ArrayList&lt;IntentFilter&gt; CONTROL_FILTERS_BASIC;
29655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    static {
29755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        ...
29855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        IntentFilter playControls = new IntentFilter();
29955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
30055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addAction(MediaControlIntent.ACTION_SEEK);
30155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addAction(MediaControlIntent.ACTION_GET_STATUS);
30255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addAction(MediaControlIntent.ACTION_PAUSE);
30355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addAction(MediaControlIntent.ACTION_RESUME);
30455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        playControls.addAction(MediaControlIntent.ACTION_STOP);
30555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC = new ArrayList&lt;IntentFilter&gt;();
30655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC.add(videoPlayback);
30755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        CONTROL_FILTERS_BASIC.add(playControls);
30855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
30955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    ...
31055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
31155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
31255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
31355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>For more information about the available playback control intents, see the
31455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaControlIntent} class.</p>
31555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
31655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
31755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h3 id="mrpd">MediaRouteProviderDescriptor</h3>
31855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
31955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>After defining the capabilities of your media route using {@link
32055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.content.IntentFilter} objects, you can then create a descriptor object for publishing to
32155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  the Android media router framework. This descriptor object contains the specifics of your media
32255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  route's capabilities so that other applications can determine how to interact with your media
32355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  route.</p>
32455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
32555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The following example code demonstrates how to add the previously created intent filters to a
32655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  {@link android.support.v7.media.MediaRouteProviderDescriptor} and set the descriptor for use by
32755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  the media router framework:</p>
32855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
32955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
33055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezpublic SampleMediaRouteProvider(Context context) {
33155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    super(context);
33255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    publishRoutes();
33355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
33455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
33555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezprivate void publishRoutes() {
33655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    Resources r = getContext().getResources();
33755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    // Create a route descriptor using previously created IntentFilters
33855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    MediaRouteDescriptor routeDescriptor = new MediaRouteDescriptor.Builder(
33955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            VARIABLE_VOLUME_BASIC_ROUTE_ID,
34055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            r.getString(R.string.variable_volume_basic_route_name))
34155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setDescription(r.getString(R.string.sample_route_description))
34255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .addControlFilters(CONTROL_FILTERS_BASIC)
34355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setPlaybackStream(AudioManager.STREAM_MUSIC)
34455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
34555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
34655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setVolumeMax(VOLUME_MAX)
34755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .setVolume(mVolume)
34855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .build();
34955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    // Add the route descriptor to the provider descriptor
35055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    MediaRouteProviderDescriptor providerDescriptor =
35155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            new MediaRouteProviderDescriptor.Builder()
35255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .addRoute(routeDescriptor)
35355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            .build();
35455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
35555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    // Publish the descriptor to the framework
35655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    setDescriptor(providerDescriptor);
35755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
35855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
35955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
36055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>For more information on the available descriptor settings, see the reference documentation
36155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  for {@link android.support.v7.media.MediaRouteDescriptor} and {@link
36255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProviderDescriptor}.</p>
36355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
36455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
36555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<h2 id="ctrl-routes">Controlling Routes</h2>
36655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
36755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>When an application connects to your media route provider, the provider receives playback
36855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  commands through the media router framework sent to your route by other apps. To handle these
36955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  requests, you must provide an implementation of a {@link
37055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider.RouteController} class, which processes the commands
37155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  and handles the actual communication to your receiver device.</p>
37255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
37355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>The media router framework calls the {@link
37455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider#onCreateRouteController onCreateRouteController()}
37555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  method of your route provider to obtain an instance of this class and then routes requests to it.
37655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  These are the key methods of the {@link
37755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider.RouteController} class, which you must implement for
37855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  your media route provider:</p>
37955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
38055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<ul>
38155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onSelect onSelect()}
38255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &mdash; Called when an application selects your route for playback. You use this method to do
38355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    any preparation work that may be required before media playback begins.</li>
38455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onControlRequest
38555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    onControlRequest()} &mdash; Sends specific playback commands to the receiving device.</li>
38655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onSetVolume
38755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    onSetVolume()} &mdash; Sends a request to the receiving device to set the playback volume to a
38855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    specific value.</li>
38955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onUpdateVolume
39055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    onUpdateVolume()} &mdash; Sends a request to the receiving device to modify the playback
39155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    volume by a specified amount.</li>
39255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onUnselect
39355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    onUnselect()} &mdash; Called when an application unselects a route.</li>
39455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onRelease onRelease()}
39555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &mdash; Called when the route is no longer needed by the framework, allowing it to free its
39655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    resources.</li>
39755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</ul>
39855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
39955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>All playback control requests, except for volume changes, are directed to the {@link
40055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider.RouteController#onControlRequest onControlRequest()}
40155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  method. Your implementation of this method must parse the control requests and respond to them
40255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  appropriately. Here is an example implementation of this method which processes commands for a
40355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  remote playback media route:</p>
40455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
40555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<pre>
40655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandezprivate final class SampleRouteController extends
40755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        MediaRouteProvider.RouteController {
40855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    ...
40955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
41055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    &#64;Override
41155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {
41255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
41355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        String action = intent.getAction();
41455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
41555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
41655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            boolean success = false;
41755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            if (action.equals(MediaControlIntent.ACTION_PLAY)) {
41855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handlePlay(intent, callback);
41955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
42055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleEnqueue(intent, callback);
42155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_REMOVE)) {
42255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleRemove(intent, callback);
42355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_SEEK)) {
42455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleSeek(intent, callback);
42555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_GET_STATUS)) {
42655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleGetStatus(intent, callback);
42755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_PAUSE)) {
42855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handlePause(intent, callback);
42955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_RESUME)) {
43055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleResume(intent, callback);
43155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_STOP)) {
43255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleStop(intent, callback);
43355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_START_SESSION)) {
43455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleStartSession(intent, callback);
43555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_GET_SESSION_STATUS)) {
43655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleGetSessionStatus(intent, callback);
43755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            } else if (action.equals(MediaControlIntent.ACTION_END_SESSION)) {
43855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez                success = handleEndSession(intent, callback);
43955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            }
44055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
44155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            Log.d(TAG, mSessionManager.toString());
44255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez            return success;
44355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        }
44455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez        return false;
44555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    }
44655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez    ...
44755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez}
44855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</pre>
44955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez
45055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez<p>It is important to understand that the {@link
45155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  android.support.v7.media.MediaRouteProvider.RouteController} class is intended to act as a wrapper
45255b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  for the API to your media playback equipment. The implementation of the methods in this class is
45355b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez  entirely dependent on the programmatic interface provided by your receiving device.</p>
454