Der Startbildschirm von Android TV oder einfach der Startbildschirm bietet eine Benutzeroberfläche, zeigt empfohlene Inhalte in einer Tabelle mit Channels und Programmen an. Jede Zeile steht für einen Channel. Ein Kanal enthält Infokarten für jedes dort verfügbare Programm:
In diesem Dokument wird beschrieben, wie Sie dem Startbildschirm Kanäle und Programme hinzufügen, Inhalte aktualisieren, Aktionen von Nutzern handhaben und Ihren Nutzern die bestmögliche Erfahrung bieten können. (Wenn Sie mehr über das API erfahren möchten, versuchen Sie es mit der Codelab für den Startbildschirm und schau dir die Android TV-Session zur I/O 2017 an.)
Hinweis:Empfehlungskanäle sind nur in Android 8.0 (API-Level 26) und höher Sie müssen sie nutzen, Empfehlungen für Apps mit Android 8.0 (API-Level 26) und höher Bis Empfehlungen für Apps geben, die unter älteren Android-Versionen laufen, muss die Methode Zeile „Empfehlungen“ .
Die Benutzeroberfläche des Startbildschirms
Apps können neue Kanäle erstellen, die Programme in einem Kanal hinzufügen, entfernen und aktualisieren sowie die Reihenfolge der Programme in einem Kanal steuern. Beispiel: Eine App kann einen Kanal mit dem Namen "Neue Funktionen" erstellen. und Karten für neu verfügbare Programme anzeigen.
Apps können nicht die Reihenfolge steuern, in der Kanäle auf dem Startbildschirm angezeigt werden. Wenn Ihre App einen neuen Kanal erstellt, wird er auf dem Startbildschirm unten in der Kanalliste hinzugefügt. Der Nutzer kann Kanäle neu anordnen, ausblenden und anzeigen.
Der Kanal „Als Nächstes ansehen“
Der Kanal „Empfohlene Videos“ ist die zweite Zeile auf dem Startbildschirm, in der Zeile „Apps“. Dieser Channel wird vom System erstellt und verwaltet. Deine App kann Folgendes hinzufügen: zum Kanal „Als Nächstes ansehen“ hinzugefügt. Weitere Informationen finden Sie unter Programme hinzufügen zu den Kanal „Als Nächstes ansehen“.
App-Kanäle
Die von deiner App erstellten Kanäle folgen alle diesem Lebenszyklus:
- Der Nutzer entdeckt einen Kanal in deiner App und bittet ihn, ihn dem Startbildschirm hinzuzufügen.
- Die App erstellt den Kanal und fügt ihn
TvProvider
hinzu. Der Kanal ist zu diesem Zeitpunkt nicht sichtbar. - Die App fordert das System auf, den Kanal anzuzeigen.
- Das System bittet den Nutzer, den neuen Kanal zu genehmigen.
- Der neue Kanal wird in der letzten Zeile des Startbildschirms angezeigt.
Standardkanal
Ihre App kann dem Nutzer beliebig viele Kanäle zum Hinzufügen zum Startbildschirm anbieten. In der Regel müssen die Nutzenden Kanäle auswählen und genehmigen, bevor sie auf dem Startbildschirm angezeigt werden. Sie haben für jede App die Möglichkeit, einen Standardkanal zu erstellen. Der Standardkanal ist speziell, da er automatisch auf dem Startbildschirm angezeigt wird. muss die nutzende Person explizit anfordern.
Voraussetzungen
Auf dem Android TV-Startbildschirm werden die TvProvider
-APIs von Android verwendet, um die von deiner App erstellten Kanäle und Programme zu verwalten.
Fügen Sie dem Manifest Ihrer App die folgende Berechtigung hinzu, um auf die Daten des Anbieters zuzugreifen:
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
Die TvProvider
-Supportbibliothek erleichtert die Verwendung des Anbieters. Fügen Sie ihn den Abhängigkeiten in der Datei build.gradle
hinzu:
Cool
implementation 'androidx.tvprovider:tvprovider:1.0.0'
Kotlin
implementation("androidx.tvprovider:tvprovider:1.0.0")
Um mit Kanälen und Programmen zu arbeiten, musst du die folgenden Importe von Supportbibliotheken in dein Programm aufnehmen:
Kotlin
import android.support.media.tv.Channel import android.support.media.tv.TvContractCompat import android.support.media.tv.ChannelLogoUtils import android.support.media.tv.PreviewProgram import android.support.media.tv.WatchNextProgram
Java
import android.support.media.tv.Channel; import android.support.media.tv.TvContractCompat; import android.support.media.tv.ChannelLogoUtils; import android.support.media.tv.PreviewProgram; import android.support.media.tv.WatchNextProgram;
Kanäle
Der erste von deiner App erstellte Kanal wird zum Standardkanal. Der Standardkanal wird automatisch auf dem Startbildschirm angezeigt. Alle anderen von dir erstellten Kanäle müssen vom Nutzer ausgewählt und akzeptiert werden, bevor sie auf dem Startbildschirm angezeigt werden.
Kanal erstellen
Ihre App sollte das System nur dann auffordern, neu hinzugefügte Kanäle anzuzeigen, wenn sie im Vordergrund ausgeführt wird. Dadurch wird verhindert, dass in deiner App ein Dialogfeld angezeigt wird, in dem du aufgefordert wirst, deinen Kanal hinzuzufügen, während der Nutzer eine andere App ausführt. Wenn du versuchst, einen Kanal hinzuzufügen, während du im Hintergrund läuft, gibt die onActivityResult()
-Methode der Aktivität den Statuscode RESULT_CANCELED
zurück.
So erstellst du einen Kanal:
Erstellen Sie einen Channel Builder und legen Sie seine Attribute fest. Das Feld Kanaltyp muss
TYPE_PREVIEW
sein. Weitere hinzufügen attributes.Kotlin
val builder = Channel.Builder() // Every channel you create must have the type
TYPE_PREVIEW
builder.setType(TvContractCompat.Channels.TYPE_PREVIEW) .setDisplayName("Channel Name") .setAppLinkIntentUri(uri)Java
Channel.Builder builder = new Channel.Builder(); // Every channel you create must have the type
TYPE_PREVIEW
builder.setType(TvContractCompat.Channels.TYPE_PREVIEW) .setDisplayName("Channel Name") .setAppLinkIntentUri(uri);Fügen Sie den Kanal in den Anbieter ein:
Kotlin
var channelUri = context.contentResolver.insert( TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues())
Java
Uri channelUri = context.getContentResolver().insert( TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues());
-
Du musst die Kanal-ID speichern, um dem Kanal Programme hinzufügen zu können . Extrahieren Sie die Kanal-ID aus dem zurückgegebenen URI:
Kotlin
var channelId = ContentUris.parseId(channelUri)
Java
long channelId = ContentUris.parseId(channelUri);
Du musst ein Logo für deinen Kanal hinzufügen. Verwenden Sie
Uri
oderBitmap
. Das Logo Das Symbol sollte 80 dp x 80 dp groß und undurchsichtig sein. Sie wird unter einem Runde Maske:Kotlin
// Choose one or the other storeChannelLogo(context: Context, channelId: Long, logoUri: Uri) // also works if logoUri is a URL storeChannelLogo(context: Context, channelId: Long, logo: Bitmap)
Java
// Choose one or the other storeChannelLogo(Context context, long channelId, Uri logoUri); // also works if logoUri is a URL storeChannelLogo(Context context, long channelId, Bitmap logo);
Standardkanal erstellen (optional): Wenn Ihre App die erste können Sie dafür sorgen, Standardkanal, damit er auf der Startseite angezeigt wird ohne dass die Nutzenden etwas tun müssen. Andere Kanäle, die Sie erstellen sind erst sichtbar, wenn der Nutzer wählt sie aus.
Kotlin
TvContractCompat.requestChannelBrowsable(context, channelId)
Java
TvContractCompat.requestChannelBrowsable(context, channelId);
- Lege fest, dass dein Standardkanal angezeigt wird, bevor deine App geöffnet wird. Sie können
Fügen Sie dazu einen
BroadcastReceiver
hinzu, der auf das Ereignisandroid.media.tv.action.INITIALIZE_PROGRAMS
Aktion, die der Startbildschirm wird gesendet, nachdem die App installiert wurde: Beim Sideloading Ihrer App während der Entwicklung können Sie diesen Schritt testen, indem Sie das Auslösen der Absicht durch ADB, your.package.name/.YourReceiverName gehört zu deiner App<receiver android:name=".RunOnInstallReceiver" android:exported="true"> <intent-filter> <action android:name="android.media.tv.action.INITIALIZE_PROGRAMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
BroadcastReceiver
:adb shell am broadcast -a android.media.tv.action.INITIALIZE_PROGRAMS -n \ your.package.name/.YourReceiverName
In seltenen Fällen kann es vorkommen, dass Ihre App die Übertragung gleichzeitig empfängt, startet Ihre App. Achte darauf, dass mit deinem Code nicht versucht wird, den Standardkanal hinzuzufügen mehrfach verwenden.
Kanal aktualisieren
Das Aktualisieren von Channels funktioniert ähnlich wie das Erstellen von Channels.
Verwenden Sie einen anderen Channel.Builder
, um die zu ändernden Attribute festzulegen.
Verwende die ContentResolver
, um den Kanal zu aktualisieren. Verwende die Kanal-ID, die du beim ursprünglichen Hinzufügen des Kanals gespeichert hast:
Kotlin
context.contentResolver.update( TvContractCompat.buildChannelUri(channelId), builder.build().toContentValues(), null, null )
Java
context.getContentResolver().update(TvContractCompat.buildChannelUri(channelId), builder.build().toContentValues(), null, null);
Verwende storeChannelLogo()
, um das Logo eines Kanals zu aktualisieren.
Löschen eines Kanals
Kotlin
context.contentResolver.delete(TvContractCompat.buildChannelUri(channelId), null, null)
Java
context.getContentResolver().delete(TvContractCompat.buildChannelUri(channelId), null, null);
Programme
Hinzufügen von Programmen zu einem App-Kanal
Erstellen Sie eine PreviewProgram.Builder
und legen Sie ihre Attribute fest:
Kotlin
val builder = PreviewProgram.Builder() builder.setChannelId(channelId) .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP) .setTitle("Title") .setDescription("Program description") .setPosterArtUri(uri) .setIntentUri(uri) .setInternalProviderId(appProgramId)
Java
PreviewProgram.Builder builder = new PreviewProgram.Builder(); builder.setChannelId(channelId) .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP) .setTitle("Title") .setDescription("Program description") .setPosterArtUri(uri) .setIntentUri(uri) .setInternalProviderId(appProgramId);
Fügen Sie je nach Art des Programms weitere Attribute hinzu. Um die Attribute anzuzeigen, die für die einzelnen Programmtypen verfügbar sind, finden Sie in den Tabellen unten.
Fügen Sie das Programm in den Anbieter ein:
Kotlin
var programUri = context.contentResolver.insert(TvContractCompat.PreviewPrograms.CONTENT_URI, builder.build().toContentValues())
Java
Uri programUri = context.getContentResolver().insert(TvContractCompat.PreviewPrograms.CONTENT_URI, builder.build().toContentValues());
Rufe die Programm-ID zur späteren Verwendung ab:
Kotlin
val programId = ContentUris.parseId(programUri)
Java
long programId = ContentUris.parseId(programUri);
Programme zum Kanal „Als Nächstes ansehen“ hinzufügen
Informationen zum Einfügen von Sendungen in den Kanal „Als Nächstes ansehen“ findest du unter Programme zur Wiedergabeseite hinzufügen Nächster Kanal.
Programm aktualisieren
Sie können die Angaben zu einem Programm ändern. Sie können beispielsweise den Leihpreis für einen Film aktualisieren oder eine Fortschrittsanzeige aktualisieren, die anzeigt, wie lange der Nutzer sich ein Programm angesehen hat.
Verwenden Sie einen PreviewProgram.Builder
, um die zu ändernden Attribute festzulegen.
Rufen Sie dann getContentResolver().update
auf, um das Programm zu aktualisieren. Gib die Programm-ID an, die du beim ursprünglichen Hinzufügen des Programms gespeichert hast:
Kotlin
context.contentResolver.update( TvContractCompat.buildPreviewProgramUri(programId), builder.build().toContentValues(), null, null )
Java
context.getContentResolver().update(TvContractCompat.buildPreviewProgramUri(programId), builder.build().toContentValues(), null, null);
Programm löschen
Kotlin
context.contentResolver .delete(TvContractCompat.buildPreviewProgramUri(programId), null, null)
Java
context.getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(programId), null, null);
Nutzeraktionen verarbeiten
Deine App kann Nutzern beim Entdecken von Inhalten helfen, indem sie eine Benutzeroberfläche zum Anzeigen und Hinzufügen von Kanälen bereitstellt. Deine App sollte auch Interaktionen mit deinen Kanälen verarbeiten, nachdem sie auf dem Startbildschirm angezeigt wurden.
Kanäle finden und hinzufügen
Ihre App kann ein UI-Element bereitstellen, über das der Nutzer Kanäle auswählen und hinzufügen kann, z. B. eine Schaltfläche zum Hinzufügen des Kanals.
Nachdem der Nutzer einen bestimmten Kanal angefordert hat, führen Sie diesen Code aus, um die Berechtigung des Nutzers zu erhalten, ihn zur Benutzeroberfläche des Startbildschirms hinzuzufügen:
Kotlin
val intent = Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE) intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId) try { activity.startActivityForResult(intent, 0) } catch (e: ActivityNotFoundException) { // handle error }
Java
Intent intent = new Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE); intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId); try { activity.startActivityForResult(intent, 0); } catch (ActivityNotFoundException e) { // handle error }
Es wird ein Dialogfeld angezeigt, in dem der Nutzer aufgefordert wird, den Kanal zu genehmigen.
Verarbeite das Ergebnis der Anfrage mit der onActivityResult
-Methode deiner Aktivität (Activity.RESULT_CANCELED
oder Activity.RESULT_OK
).
Ereignisse auf dem Android TV-Startbildschirm
Wenn der Nutzer mit den von der App veröffentlichten Programmen/Kanälen interagiert, sendet der Startbildschirm Intents an die App:
- Der Startbildschirm sendet die im APP_LINK_INTENT_URI-Attribut eines Kanals gespeicherten
Uri
an die App, wenn der Nutzer das Logo des Kanals auswählt. Die App sollte nur ihre Hauptbenutzeroberfläche oder eine Ansicht für den ausgewählten Kanal starten. - Der Startbildschirm sendet den im INTENT_URI-Attribut eines Programms gespeicherten
Uri
an die App, wenn der Nutzer ein Programm auswählt. Die App sollte die ausgewählten Inhalte wiedergeben. - Der Nutzer kann angeben, dass er nicht mehr an einem Programm interessiert ist, und möchte, dass es von der Benutzeroberfläche des Startbildschirms entfernt wird. Das System entfernt das Programm von der Benutzeroberfläche und sendet der App, zu der das Programm gehört, einen Intent (android.media.tv.ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED oder android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED) mit der Programm-ID. Die App sollte das Programm vom Anbieter entfernen und nicht wieder einlegen.
Erstellen Sie Intent-Filter für alle Uris
, die der Startbildschirm für Nutzerinteraktionen sendet. Beispiel:
<receiver
android:name=".WatchNextProgramRemoved"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
</intent-filter>
</receiver>
Best Practices
- Bei vielen TV-Apps ist eine Anmeldung erforderlich. In diesem Fall ist
BroadcastReceiver
der aufandroid.media.tv.action.INITIALIZE_PROGRAMS
wartet, sollte Kanalinhalte für nicht authentifizierte Nutzer.Ihre App kann beispielsweise anfangs die besten oder aktuell beliebtesten Inhalte anzuzeigen. Nachdem sich der Nutzer angemeldet hat, personalisierte Inhalte anzuzeigen. Dies ist eine große Chance für Apps, um Up-Selling zu betreiben. bevor sie sich anmelden. - Wenn Ihre App nicht im Vordergrund ausgeführt wird und Sie einen Kanal oder eine
Programm mit dem
JobScheduler
, um die Arbeit zu planen (siehe: JobScheduler und JobService). - Bei einem fehlerhaften Verhalten deiner App kann das System die Anbieterberechtigungen deiner App widerrufen. (z. B. kontinuierliches Spamming des Anbieters mit Daten). Achten Sie darauf, den Code, der auf den Anbieter zugreift, in Try-Catch-Klauseln Sicherheitsausnahmen.
Bevor Sie Programme und Kanäle aktualisieren, fragen Sie den Anbieter nach den Daten, die Daten aktualisieren und abgleichen müssen. Beispielsweise ist es nicht notwendig, ein Programm, das Nutzende von der Benutzeroberfläche entfernen lassen möchten. Verwenden Sie einen Hintergrundjob, fügt Ihre Daten beim Anbieter ein bzw. aktualisiert sie nach der Abfrage der vorhandenen und fordern dann die Genehmigung für Ihre Channels an. Sie können diesen Job ausführen, wenn und wann immer die App ihre Daten aktualisieren muss.
Kotlin
context.contentResolver .query( TvContractCompat.buildChannelUri(channelId), null, null, null, null).use({ cursor-> if (cursor != null and cursor.moveToNext()) { val channel = Channel.fromCursor(cursor) if (channel.isBrowsable()) { //update channel's programs } } })
Java
try (Cursor cursor = context.getContentResolver() .query( TvContractCompat.buildChannelUri(channelId), null, null, null, null)) { if (cursor != null && cursor.moveToNext()) { Channel channel = Channel.fromCursor(cursor); if (channel.isBrowsable()) { //update channel's programs } } }
Verwenden Sie für alle Bilder eindeutige URIs (Logos, Symbole, Inhaltsbilder). Achten Sie darauf, einen anderen URI zu verwenden, wenn Sie ein Bild aktualisieren. Alle Bilder werden im Cache gespeichert. Wenn Sie den URI beim Ändern des Bildes nicht ändern, wird das alte Bild weiterhin angezeigt.
Denken Sie daran, dass WHERE-Klauseln nicht zulässig sind und Aufrufe an Anbieter mit WHERE-Klauseln eine Sicherheitsausnahme auslösen.
Attribute
In diesem Abschnitt werden die Kanal- und Programmattribute separat beschrieben.
Kanalattribute
Die folgenden Attribute müssen für jeden Kanal angegeben werden:
Attribut | Hinweise |
---|---|
SCHREIBMASCHINE | auf TYPE_PREVIEW festgelegt. |
DISPLAY_NAME | auf den Namen des Channels festgelegt. |
APP_LINK_INTENT_URI | Wenn der Nutzer das Logo des Kanals auswählt, sendet das System einen Intent, um eine Aktivität zu starten, bei der für den Kanal relevante Inhalte präsentiert werden. Legen Sie dieses Attribut auf den URI fest, der im Intent-Filter für diese Aktivität verwendet wird. |
Darüber hinaus verfügt ein Kanal über sechs Felder, die für die interne App-Nutzung reserviert sind. In diesen Feldern können Schlüssel oder andere Werte gespeichert werden, mit denen die App den Kanal seiner internen Datenstruktur zuordnen kann:
- INTERNE_PROVIDER_ID
- INTERNE_PROVIDER_DATA
- INTERN_ANBIETER_FLAG1
- INTERN_ANBIETER_FLAG2
- INTERN_ANBIETER_FLAG3
- INTERN_ANBIETER_FLAG4
Programmattribute
Die Attribute für die einzelnen Programmtypen finden Sie auf den einzelnen Seiten:
- Attribute des Videoprogramms
- Attribute des Audioprogramms
- Attribute des Programms für Glücksspiele
- Attribute des Programms „Empfohlene Videos“
Beispielcode
Weitere Informationen zum Erstellen von Apps, die mit dem Startbildschirm interagieren und Kanäle und Programme zum Android TV-Startbildschirm hinzufügen, findest du in unserem Codelab für den Startbildschirm.