Developer Console
Thank you for your visit. This page is only available in English at this time.

Live TV Resources

The following best practices, code samples, and other references will help you better understand the specifics of live integration during the implementation phase.

Whitelisting Package

A package "whitelist" determines which applications are capable of surfacing their channels in the Fire TV browse and search experiences. You will need to share a list of Device Serial Numbers (DSN) with your Amazon counterpart to ensure you are able to integrate and validate the features outlined above on your device prior to launching.

Best Practices

The following product and implementation guidelines will help provide your customers with the best live TV experience on Fire TV:

  • Provide a friction-free sign-up to encourage trial where applicable. Examples include reducing registration forms on the application or utilizing a phone number to sign up.
  • Support live channel previews in browse to drive engagement.
  • Use a transparent, monochrome logo for each TvContract.Channels.Logo in your channel lineup.
  • Optimize deep-link flow to begin full-screen playback in less than 2.5 seconds.
  • Leverage Gracenote channel IDs where applicable to simplify integration.
  • Focus on metadata loading performance over having full schedule availability.
  • Use JobScheduler or WorkManager to periodically check and ensure entitlements are always accurate. This will ensure your channels in the browse and search experiences are in sync with the reality of entitled channels at all times even if your application does not enter the foreground.
  • Update your entitled channel list in place is preferred to removing and re-adding all channels in the case where the entitled channel list has changed slightly.
  • Provide a displayable channel name for COLUMN_DISPLAY_NAME column since this may be used as a fallback in the UI. Fire TV displays up to 16 alphanumeric or 8-10 full-width characters.

Code Samples

This section contains code samples related to live TV integrations.

The following code shows how to include a Gracenote ID and deeplink into the TV database.

 * Variable to store the type of external ID, which is used for the matching service metadata. Valid types are
 * defined below as constants with prefix "EXTERNAL_ID_TYPE_"
 * Null or invalid data will result in failed service
 * match of metadata
private final static String EXTERNAL_ID_TYPE = "externalIdType";

 * Variable to store the value of external ID, which is used for the matching service metadata.
 * Null or invalid data will result in failed service match of metadata
private final static String EXTERNAL_ID_VALUE = "externalIdValue";

 * Uri for deep link of playback into external player.
 * Null or invalid data will result in default as integrated with Gordon player
private final static String PLAYBACK_DEEP_LINK_URI = "playbackDeepLinkUri";

// Contract for list of known External ID Type Constants
private final static String EXTERNAL_ID_TYPE_GRACENOTE_ONTV = "gracenote_ontv"; // gracenote ontv id
private final static String EXTERNAL_ID_TYPE_GRACENOTE_GVD = "gracenote_gvd"; // gracenote gvd id

// Contract for playback deep link uri
// Use Intent.URI_INTENT_SCHEME to create uri from intent and to covert back to original intent
Intent playbackDeepLinkIntent; // Created by your app
String playbackDeepLinkUri = playbackDeepLinkIntent.toUri(Intent.URI_INTENT_SCHEME);

// Construct BLOB
ContentValues values = new ContentValues();  // store all the channel data
ContentResolver resolver = context.getContentResolver();
values.put(TvContract.Channels.COLUMN_DISPLAY_NAME, "#Actual display name#");
values.put(TvContract.Channels.COLUMN_INPUT_ID, "#Actual input id#");
try {
    String jsonString = new JSONObject()
                  .put(EXTERNAL_ID_TYPE, "#Actual Id Type#") // replace with EXTERNAL_ID_TYPE_GRACENOTE_XXX
                  .put(EXTERNAL_ID_VALUE, "#Actual Id Value#") // replace with gracenote ID value associated with channel
                  .put(PLAYBACK_DEEP_LINK_URI, playbackDeepLinkUri).toString();

    values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, jsonString.getBytes());
} catch (JSONException e) {
    Log.e(TAG, "Error when adding data to blob " + e);

Uri uri = resolver.insert(TvContract.Channels.CONTENT_URI, values);

Honoring Parental Controls

The following code demonstrates how to listen to parental controls for live preview or native full screen playback.

private TvContentRating mBlockedRating = null;

    public boolean onTune(final Uri channelUri) {
        if (mTvInputManager.isParentalControlsEnabled()) {
            // ensure playback is not audible or visible on the Surface
            mBlockedRating = <content_rating>;
            // 1. Triggers PIN prompt to user when in fullscreen playback
            // 2. Ensures the program image does not flip to the playback Surface
            //    when browsing the On Now row.
        } else {
            // playback should start

    public void onUnblockContent(final TvContentRating unblockedRating) {
        // the user successfully entered their PIN to unblock content for the
        // provided rating
        if (unblockedRating.unblockContent(mBlockedRating)) {
            // playback should start

Sample Live TV App

A sample app with live TV integration is available on GitHub at This sample TV app is based on the Google sample TV app. You can use this sample app as a reference for the live TV integration on Fire TV.

Locale Support for the Sample App

The sample app is supported only in the following locales: US, CA, UK, DE, JP, ES, and IN. For IN, only Fire TV Edition is supported. For MX, BR, AU, and other locales, the sample app will not work because these marketplaces do not have the same Fire TV user interface as the supported locales. MX, BR, and AU will be upgraded to the necessary Fire TV user interface at a later time. When that update happens, the sample app will be supported in the MX, BR, and AU locales.

To load the sample app:

  1. Go to, click Clone or download, and then click Download ZIP. Unzip the download.

    The app shows sample code for integrating live TV. To see the result, use adb to sideload the app-debug.apk file onto your Fire TV, as described in the following steps.

  2. Connect to Fire TV through adb.

    If you've already turned on debugging and have adb installed, just get your Fire TV's IP address from Settings > Device & Software (or My Fire TV) > About > Network and run the following, customizing the IP address for your own Fire TV:

    adb connect 123.456.7.89:5555

    Replace 123.456.7.89 with your Fire TV's IP address. (If you have trouble connecting and you're on your corporate VPN, try disconnecting from VPN, since your computer needs to be on the same wifi network as your Fire TV.)

  3. Install the built APK in the sample app:

    adb install -r AndroidTvSampleInput/app/build/outputs/apk/app-debug.apk

    The response is as follows:

    Performing Streamed Install

    Note that this sample app does not launch as a standalone app in the traditional sense. Instead, it incorporates code for live TV channels available from the Fire TV device.

  4. On your Fire TV device, go to Settings > Applications > Manage Installed Applications. Select Sample TV Inputs. Then click Launch application.

    Sample TV inputs
    Sample TV inputs

    This will take you to the Amazon developer portal.

    Amazon Fire TV site
    Amazon Fire TV site
  5. On your Fire TV remote, click the Home button to back out of this screen. Then go to Settings > Live TV > Sync Sources > Amazon Sample TV Input.

    This will load the sample channels.

    Syncing sources
    Syncing sources
  6. After the sync finishes, click the Home button. Channels should now be visible in the "On Now" row and Guide.

    Here's the "On Now" row:

    Fire TV 'On Now' row
    Fire TV 'On Now' row

    Here's the Channel Guide.

    Fire TV Channel Guide
    Fire TV Channel Guide

    To navigate to the Channel Guide on Fire TV, go to your Home screen, page down to the "On Now" row, press the menu button on your remote, and then click Channel Guide. You can also click the mic button on your remote and say "Channel Guide."