| page.title=Developing a TV Input Service |
| page.tags=tv, tif |
| helpoutsWidget=true |
| |
| trainingnavtop=true |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#manifest">Declare Your TV Input Service in the Manifest</a></li> |
| <li><a href="#tvinput">Define Your TV Input Service</a></li> |
| <li><a href="#setup">Define Your Setup Activity</a></li> |
| </ol> |
| <h2>You should also read</h2> |
| <ul> |
| <li><a href="{@docRoot}reference/android/media/tv/package-summary.html"> |
| android.media.tv</a></li> |
| <li><a class="external-lin" href="http://source.android.com/devices/tv/index.html"> |
| TV Input Framework</a></li> |
| </ul> |
| <h2>Try It Out</h2> |
| <ul> |
| <li><a class="external-link" href="https://github.com/googlesamples/androidtv-sample-inputs"> |
| TV Input Service sample app</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| <p>A TV input service represents a media stream source, and lets you present your media content in a |
| linear, broadcast TV fashion as channels and programs. With the TV input service, you can provide |
| parental controls, program guide information, and content ratings. The TV input service works |
| with the Android system TV app, developed for the device and immutable by third-party apps, which |
| ultimately controls and presents content on the TV. See |
| <a class="external-link" href="http://source.android.com/devices/tv/index.html"> |
| TV Input Framework</a> for more information about the framework architecture and its components.</p> |
| |
| <p>To develop a TV input service, you implement the following components:</p> |
| |
| <ul> |
| <li>{@link android.media.tv.TvInputService} provides long-running and background availability for |
| the TV input</li> |
| <li>{@link android.media.tv.TvInputService.Session} maintains the TV input state and communicates |
| with the hosting app</li> |
| <li>{@link android.media.tv.TvContract} describes the channels and programs available to the TV |
| input</li> |
| <li>{@link android.media.tv.TvContract.Channels} represents information about a TV channel</li> |
| <li>{@link android.media.tv.TvContract.Programs} describes a TV program with data such as program |
| title and start time</li> |
| <li>{@link android.media.tv.TvTrackInfo} represents an audio, video, or subtitle track</li> |
| <li>{@link android.media.tv.TvContentRating} describes a content rating, allows for custom content |
| rating schemes</li> |
| <li>{@link android.media.tv.TvInputManager} provides an API to the system TV app and manages |
| the interaction with TV inputs and apps</li> |
| </ul> |
| |
| <h2 id="manifest">Declare Your TV Input Service in the Manifest</h2> |
| |
| <p>Your app manifest must declare your {@link android.media.tv.TvInputService}. Within that |
| declaration, specify the {@link android.Manifest.permission#BIND_TV_INPUT} permission to allow the |
| service to connect the TV input to the system. A system service (<code>TvInputManagerService</code>) |
| performs the binding and has that permission. The system TV app sends requests to TV input services |
| via the {@link android.media.tv.TvInputManager} interface. The service declaration must also |
| include an intent filter that specifies the {@link android.media.tv.TvInputService} |
| as the action to perform with the intent. Also within the service declaration, declare the service |
| meta data in a separate XML resource. The service declaration, the intent filter and the service |
| meta data are described in the following example.</p> |
| |
| <pre> |
| <service android:name="com.example.sampletvinput.SampleTvInput" |
| android:label="@string/sample_tv_input_label" |
| android:permission="android.permission.BIND_TV_INPUT"> |
| <intent-filter> |
| <action android:name="android.media.tv.TvInputService" /> |
| </intent-filter> |
| <meta-data android:name="android.media.tv.input" |
| android:resource="@xml/sample_tv_input" /> |
| </service> |
| </pre> |
| |
| <p>Define the service meta data in separate XML file, as shown in the following example. The service |
| meta data must include a setup interface that describes the TV input's initial configuration and |
| channel scan. The service meta data file is located in the XML resources directory |
| for your application and must match the name of the resource in the manifest. Using the example |
| manifest entries above, you would create an XML file in the location |
| <code>res/xml/sample_tv_input.xml</code>, with the following contents:</p> |
| |
| <pre> |
| <tv-input xmlns:android="http://schemas.android.com/apk/res/android" |
| android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" /> |
| </pre> |
| |
| <h2 id="tvinput">Define Your TV Input Service</h2> |
| |
| <div class="figure"> |
| <img id="tvinputlife" src="{@docRoot}images/tv/tvinput-life.png" alt=""/> |
| <p class="img-caption"><strong>Figure 1.</strong>TvInputService lifecycle.</p> |
| </div> |
| |
| <p>For your service, you extend the {@link android.media.tv.TvInputService} class. A |
| {@link android.media.tv.TvInputService} implementation is a |
| <a href="{@docRoot}guide/components/bound-services.html">bound service</a> where the system service |
| (<code>TvInputManagerService</code>) is the client that binds to it. The service life cycle methods |
| you need to implement are illustrated in figure 1.</p> |
| |
| <p>The {@link android.app.Service#onCreate()} method initializes and starts the |
| {@link android.os.HandlerThread} which provides a process thread separate from the UI thread to |
| handle system-driven actions. In the following example, the {@link android.app.Service#onCreate()} |
| method initializes the {@link android.view.accessibility.CaptioningManager} and prepares to handle |
| the {@link android.media.tv.TvInputManager#ACTION_BLOCKED_RATINGS_CHANGED} |
| and {@link android.media.tv.TvInputManager#ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED} actions. These |
| actions describe system intents fired when the user changes the parental control settings, and when |
| there is a change on the list of blocked ratings.</p> |
| |
| <pre> |
| @Override |
| public void onCreate() { |
| super.onCreate(); |
| mHandlerThread = new HandlerThread(getClass() |
| .getSimpleName()); |
| mHandlerThread.start(); |
| mDbHandler = new Handler(mHandlerThread.getLooper()); |
| mHandler = new Handler(); |
| mCaptioningManager = (CaptioningManager) |
| getSystemService(Context.CAPTIONING_SERVICE); |
| |
| setTheme(android.R.style.Theme_Holo_Light_NoActionBar); |
| |
| mSessions = new ArrayList<BaseTvInputSessionImpl>(); |
| IntentFilter intentFilter = new IntentFilter(); |
| intentFilter.addAction(TvInputManager |
| .ACTION_BLOCKED_RATINGS_CHANGED); |
| intentFilter.addAction(TvInputManager |
| .ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED); |
| registerReceiver(mBroadcastReceiver, intentFilter); |
| } |
| </pre> |
| |
| <p> See <a href="{@docRoot}training/tv/tif/ui.html#control"> |
| Control Content</a> for more information about working with blocked content and providing |
| parental control. See {@link android.media.tv.TvInputManager} for more system-driven actions that |
| you may want to handle in your TV input service.</p> |
| |
| <p>The {@link android.media.tv.TvInputService} creates a |
| {@link android.media.tv.TvInputService.Session} that implements {@link android.os.Handler.Callback} |
| to handle player state changes. With {@link android.media.tv.TvInputService.Session#onSetSurface(android.view.Surface) onSetSurface()}, |
| the {@link android.media.tv.TvInputService.Session} sets the {@link android.view.Surface} with the |
| video content. See <a href="{@docRoot}training/tv/tif/ui.html#surface">Integrate Player with Surface</a> |
| for more information about working with {@link android.view.Surface} to render video.</p> |
| |
| <p>The {@link android.media.tv.TvInputService.Session} handles the |
| {@link android.media.tv.TvInputService.Session#onTune(android.net.Uri) onTune()} |
| event when the user selects a channel, and notifies the system TV app for changes in the content and |
| content meta data. These <code>notify()</code> methods are described in |
| <a href="{@docRoot}training/tv/tif/ui.html#control"> |
| Control Content</a> and <a href="{@docRoot}training/tv/tif/ui.html#track">Handle Track Selection</a> |
| further in this training.</p> |
| |
| <h2 id="setup">Define Your Setup Activity</h2> |
| |
| <p>The system TV app works with the setup activity you define for your TV input. The |
| setup activity is required and must provide at least one channel record for the system database. The |
| system TV app will invoke the setup activity when it cannot find a channel for the TV input. |
| <p>The setup activity describes to the system TV app the channels made available through the TV |
| input, as demonstrated in the next lesson, <a href="{@docRoot}training/tv/tif/channel.html">Creating |
| and Updating Channel Data</a>.</p> |