Umgang mit TV-Hardware

Die TV-Hardware unterscheidet sich grundlegend von anderen Android-Geräten. Einige der Hardwarefunktionen anderer Android-Geräte wie Touchscreens, Kameras und GPS-Empfänger sind auf Fernsehern nicht vorhanden. Fernseher sind außerdem vollständig von sekundären Hardwaregeräten abhängig: Damit Nutzer TV-Apps verwenden können, benötigen sie eine Fernbedienung oder ein Gamepad. Wenn du eine App für Fernseher entwickelst, musst du die Hardwareeinschränkungen und Anforderungen für die Nutzung auf Fernseher-Hardware genau berücksichtigen.

In dieser Anleitung erfährst du, wie du prüfen kannst, ob deine App auf einem Fernseher läuft, und was du mit nicht unterstützten Hardwarefunktionen tun kannst. Informationen zu den verschiedenen Eingabemethoden finden Sie unter TV-Controller verwalten.

Nach einem TV-Gerät suchen

Wenn du eine App entwickelst, die sowohl auf TV-Geräten als auch auf anderen Geräten funktioniert, musst du möglicherweise prüfen, auf welcher Art von Gerät deine App ausgeführt wird, und die Funktionsweise der App anpassen. Wenn du beispielsweise eine App hast, die über Intent gestartet werden kann, kannst du anhand der Geräteeigenschaften bestimmen, ob eine TV- oder Smartphone-Aktivität gestartet werden soll.

Um festzustellen, ob deine App auf einem Fernsehgerät ausgeführt wird, empfehlen wir, mit der Methode PackageManager.hasSystemFeature() zu prüfen, ob das Gerät im Fernsehmodus läuft. Der folgende Beispielcode zeigt, wie du prüfen kannst, ob deine App auf einem Fernseher ausgeführt wird:

Kotlin

const val TAG = "DeviceTypeRuntimeCheck"

val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device")
} else {
    Log.d(TAG, "Running on a non-TV Device")
}

Java

public static final String TAG = "DeviceTypeRuntimeCheck";

boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device");
} else {
    Log.d(TAG, "Running on a non-TV Device");
}

Umgang mit nicht unterstützten Hardwarefunktionen

Je nach Design und Funktionalität Ihrer Anwendung können Sie möglicherweise verhindern, dass bestimmte Hardwarefunktionen nicht verfügbar sind. In diesem Abschnitt wird erläutert, welche Hardwarefunktionen normalerweise nicht für Fernseher verfügbar sind, wie man fehlende Hardwarefunktionen erkennt und welche Alternativen zu diesen Funktionen vorgeschlagen werden.

Nicht unterstützte Funktionen der TV-Hardware

Fernseher erfüllen einen anderen Zweck als andere Geräte und haben daher keine Hardwarefunktionen, die andere Android-Geräte häufig haben. Aus diesem Grund unterstützt das Android-System die folgenden Funktionen für Fernseher nicht:

Hardware Android-Funktionsdeskriptor
Touchscreen android.hardware.touchscreen
Touchscreen-Emulator android.hardware.faketouch
Telefonie android.hardware.telephony
Kamera android.hardware.camera
Nahfeldkommunikation (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Mikrofon android.hardware.microphone
Sensoren android.hardware.sensor
Bildschirm im Hochformat android.hardware.screen.portrait

Hinweis:Einige TV-Controller sind mit einem Mikrofon ausgestattet. Diese Funktion entspricht nicht der hier beschriebenen Mikrofonhardwarefunktion. Das Controller-Mikrofon wird vollständig unterstützt.

Eine vollständige Liste der Features, Subfeatures und ihrer Deskriptoren finden Sie in der Features-Referenz.

Hardwareanforderungen für Fernseher angeben

Für Android-Apps können im App-Manifest Anforderungen an Hardwarefunktionen festgelegt werden, damit sie nicht auf Geräten installiert werden, die diese Funktionen nicht bieten. Wenn du eine vorhandene App für die Nutzung auf Fernsehern erweiterst, solltest du das Manifest der App sorgfältig auf Deklarationen zu Hardwareanforderungen prüfen, die die Installation auf einem Fernseher verhindern könnten.

Wenn deine App Hardwarefunktionen wie einen Touchscreen oder eine Kamera nutzt, die auf Fernsehern nicht verfügbar sind, aber ohne diese Funktionen ausgeführt werden können, ändere dein App-Manifest so, dass diese Funktionen nicht erforderlich sind. Das folgende Manifest-Code-Snippet zeigt, wie du deklarieren kannst, dass für deine App keine Hardwarefunktionen erforderlich sind, die auf Fernsehern nicht verfügbar sind. Diese Funktionen werden aber auf Nicht-TV-Geräten verwendet:

<uses-feature android:name="android.hardware.touchscreen"
        android:required="false"/>
<uses-feature android:name="android.hardware.faketouch"
        android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
        android:required="false"/>
<uses-feature android:name="android.hardware.camera"
        android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
        android:required="false"/>
<uses-feature android:name="android.hardware.location.gps"
        android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
        android:required="false"/>
<uses-feature android:name="android.hardware.sensor"
        android:required="false"/>
<!-- Some TV devices have an ethernet connection only -->
<uses-feature android:name="android.hardware.wifi"
        android:required="false"/>

Hinweis: Einige Features haben Unterfeatures wie android.hardware.camera.front, wie in der Feature-Referenz beschrieben. Kennzeichnen Sie alle Subfunktionen, die auch in Ihrer App verwendet werden, als required="false".

In allen Apps, die für die Nutzung auf Fernsehern bestimmt sind, muss deklariert sein, dass die Touchscreen-Funktion nicht erforderlich ist, wie unter Erste Schritte mit TV-Apps beschrieben. Wenn deine App normalerweise eine oder mehrere der Funktionen nutzt, die von Fernsehern nicht unterstützt werden, ändere die Attributeinstellung android:required in deinem Manifest für diese Funktionen zu false.

Achtung:Wenn du eine Hardwarefunktion als erforderlich angibst, indem du deren Wert auf true setzt, wird deine App nicht auf Fernsehern installiert oder im Startbildschirm von Android TV angezeigt.

Seien Sie sich der Berechtigungen bewusst, die Hardwarefunktionen implizieren

Einige uses-permission-Manifestdeklarationen beziehen sich auf Hardwarefunktionen. Wenn du also bestimmte Berechtigungen in deinem App-Manifest anfordert, kann dies dazu führen, dass deine App nicht auf Fernsehern installiert und verwendet werden kann. Die folgenden häufig angeforderten Berechtigungen schaffen eine implizite Anforderung an Hardwarefunktionen:

Berechtigung Implizierte Hardwarefunktion
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera und
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (nur Ziel-API-Level 20 oder niedriger)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (nur Ziel-API-Level 20 oder niedriger)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Einige TV-Geräte haben nur eine Ethernet-Verbindung.

Eine vollständige Liste der Berechtigungsanfragen, die eine Anforderung an Hardwarefunktionen implizieren, finden Sie in der Anleitung uses-feature. Wenn deine App eine der zuvor aufgeführten Funktionen anfordert, füge in dein Manifest für die implizite Hardwarefunktion eine uses-feature-Deklaration ein, die angibt, dass dies nicht erforderlich ist. android:required="false".

Hinweis:Wenn deine App auf Android 5.0 (API-Level 21) oder höher ausgerichtet ist und die Berechtigung ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION verwendet, können Nutzer deine App auch dann auf einem Fernseher installieren, wenn das TV-Gerät keine Netzwerkkarte oder keinen GPS-Empfänger hat.

Nachdem Sie Hardwarefunktionen für Ihre Anwendung als optional festgelegt haben, müssen Sie die Verfügbarkeit dieser Funktionen zur Laufzeit prüfen und dann das Verhalten der Anwendung anpassen. Im nächsten Abschnitt wird erläutert, wie du nach Hardwarefunktionen suchen kannst, und es werden einige Ansätze zum Ändern des Verhaltens deiner Anwendung vorgeschlagen.

Weitere Informationen zum Filtern und Deklarieren von Features im Manifest findest du im Leitfaden zu uses-feature.

Auf Hardwarefunktionen prüfen

Das Android-Framework informiert dich, wenn Hardwarefunktionen auf dem Gerät, auf dem deine App ausgeführt wird, nicht verfügbar sind. Verwenden Sie die Methode hasSystemFeature(String), um während der Laufzeit nach bestimmten Features zu suchen. Diese Methode verwendet ein einzelnes Stringargument, das das zu prüfende Feature angibt.

Das folgende Codebeispiel zeigt, wie die Verfügbarkeit von Hardwarefunktionen zur Laufzeit erkannt wird:

Kotlin

// Check whether the telephony hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls")
}

// Check whether android.hardware.touchscreen feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.")
}

Java

// Check whether the telephony hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls");
}

// Check whether android.hardware.touchscreen feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.");
}

Touchscreen

Da die meisten Fernseher keine Touchscreens haben, unterstützt Android keine Touchscreen-Interaktion für Fernsehgeräte. Außerdem entspricht die Verwendung eines Touchscreens nicht der Ansicht, in der der Nutzer 3 Meter vom Display entfernt ist. Achte darauf, dass deine UI-Elemente und dein Text nicht die Verwendung eines Touchscreens erfordern oder andeuten.

Entwickle deine App für TV-Geräte so, dass sie die Navigation mit einem Steuerkreuz auf der Fernbedienung eines Fernsehers unterstützt. Weitere Informationen zur ordnungsgemäßen Unterstützung der Navigation mit Steuerelementen, die für Fernseher geeignet sind, findest du unter TV-Navigation.

Kamera

Obwohl ein Fernseher normalerweise keine Kamera hat, können Sie auf einem Fernseher eine fotografische App anbieten. Wenn du beispielsweise eine App hast, mit der Fotos aufgenommen, angesehen und bearbeitet werden können, kannst du die entsprechende Funktion für Fernseher deaktivieren und Nutzern weiterhin erlauben, Fotos anzusehen und zu bearbeiten. Wenn deine kamerabezogene App auf einem Fernseher funktionieren soll, füge deinem App-Manifest die folgende Funktionsdeklaration hinzu:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Wenn Sie festlegen, dass Ihre App ohne Kamera ausgeführt werden soll, fügen Sie Code in die App ein, der erkennt, ob die Kamerafunktion verfügbar ist, und Anpassungen an der Funktionsweise der App vornimmt. Im folgenden Codebeispiel wird gezeigt, wie Sie die Präsenz einer Kamera erkennen:

Kotlin

// Check whether the camera hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!")
} else {
    Log.d("Camera test", "No camera available. View and edit features only.")
}

Java

// Check whether the camera hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!");
} else {
    Log.d("Camera test", "No camera available. View and edit features only.");
}

GPS

Fernseher sind stationäre Geräte für den Innenbereich und haben keinen integrierten GPS-Empfänger (Global Positioning System). Auch wenn Ihre App Standortinformationen verwendet, können Sie Nutzern die Suche nach einem Standort gestatten oder einen statischen Standortanbieter verwenden, z. B. eine Postleitzahl, die bei der Einrichtung des Fernsehers konfiguriert wurde.

Kotlin

// Request a static location from the location manager.
val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val location: Location = locationManager.getLastKnownLocation("static")

// Attempt to get postal code from the static location object.
val geocoder = Geocoder(this)
val address: Address? =
        try {
            geocoder.getFromLocation(location.latitude, location.longitude, 1)[0]
                    .apply {
                        Log.d(TAG, postalCode)
                    }
        } catch (e: IOException) {
            Log.e(TAG, "Geocoder error", e)
            null
        }

Java

// Request a static location from the location manager.
LocationManager locationManager = (LocationManager) this.getSystemService(
        Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation("static");

// Attempt to get postal code from the static location object.
Geocoder geocoder = new Geocoder(this);
Address address = null;
try {
  address = geocoder.getFromLocation(location.getLatitude(),
          location.getLongitude(), 1).get(0);
  Log.d("Postal code", address.getPostalCode());

} catch (IOException e) {
  Log.e(TAG, "Geocoder error", e);
}

Wiedergabe im Energiesparmodus pausieren

Einige TV-Geräte unterstützen einen Energiesparmodus, wenn der Nutzer das Gerät ausschaltet. Anstatt das Gerät herunterzufahren, wird die Anzeige deaktiviert und Android TV läuft im Hintergrund weiter. Die Audioausgabe ist in diesem Modus weiterhin aktiviert. Stoppen Sie daher alle derzeit wiedergegebenen Inhalte, wenn sich das Gerät im Energiesparmodus befindet.

Um die Wiedergabe im Energiesparmodus zu vermeiden, überschreiben Sie onStop() und beenden Sie alle aktuell wiedergegebenen Inhalte:

Kotlin

override fun onStop() {
    // App-specific method to stop playback.
    stopPlayback()
    super.onStop()
}

Java

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

Wenn der Nutzer die Stromversorgung wieder einschaltet, wird onStart() aufgerufen, sofern Ihre App die aktive App im Vordergrund ist. Weitere Informationen zum Starten und Beenden einer Aktivität finden Sie unter Aktivitätslebenszyklus.