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<service android:name=".provider.SampleMediaRouteProviderService" 15655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez android:label="@string/sample_media_route_provider_service" 15755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez android:process=":mrp"> 15855b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez <intent-filter> 15955b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez <action android:name="android.media.MediaRouteProviderService" /> 16055b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez </intent-filter> 16155b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez</service> 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 @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 — 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 — 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} — 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<IntentFilter> 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<IntentFilter>(); 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<IntentFilter> 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<IntentFilter>(); 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<IntentFilter> 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<IntentFilter>(); 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 — 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()} — Sends specific playback commands to the receiving device.</li> 38655b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onSetVolume 38755b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez onSetVolume()} — 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()} — 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()} — Called when an application unselects a route.</li> 39455b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez <li>{@link android.support.v7.media.MediaRouteProvider.RouteController#onRelease onRelease()} 39555b38fadd0d815450a3461f143c525429ab6b0f5Joe Fernandez — 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 @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