Umgang mit TV-Hardware

Die TV-Hardware unterscheidet sich erheblich von der anderer Android-Geräte. Einige der Hardwarefunktionen anderer Android-Geräte wie Touchscreens, Kameras und GPS-Empfänger sind auf Fernsehern nicht vorhanden. Fernseher sind auch vollständig von sekundären Hardwaregeräten abhängig: Damit Nutzer mit TV-Apps interagieren können, müssen sie eine Fernbedienung oder ein Gamepad verwenden. Informationen zu den verschiedenen Eingabemethoden findest du unter TV-Controller verwalten.

Wenn du eine App für TV-Geräte entwickelst, beachte die Hardwareeinschränkungen und -anforderungen für den Betrieb mit TV-Hardware. Prüfe, ob deine App auf einem Fernseher ausgeführt wird und nicht unterstützte Hardwarefunktionen unterstützt.

Fernseher suchen

Wenn du eine App entwickelst, die sowohl auf Fernsehern als auch auf anderen Geräten funktioniert, musst du möglicherweise prüfen, auf welcher Art von Gerät sie ausgeführt wird, und ihre Funktionsweise anpassen. Wenn du beispielsweise eine App hast, die über ein Intent gestartet werden kann, solltest du in den Geräteeigenschaften prüfen, ob eine fernsehorientierte oder eine Smartphone-Aktivität gestartet werden soll.

Die empfohlene Methode, um festzustellen, ob deine App auf einem Fernseher ausgeführt wird, besteht darin, mit der Methode PackageManager.hasSystemFeature() zu prüfen, ob das Gerät im TV-Modus ausgeführt wird. 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 deiner App kannst du möglicherweise verhindern, dass bestimmte Hardwarefunktionen nicht mehr verfügbar sind. In diesem Abschnitt wird erläutert, welche Hardwarefunktionen für Fernseher normalerweise nicht verfügbar sind, wie fehlende Hardwarefunktionen erkannt werden können und welche Alternativen zu diesen Funktionen vorgeschlagen werden.

Nicht unterstützte TV-Hardwarefunktionen

Fernseher erfüllen einen anderen Zweck als andere Geräte. Sie haben daher keine Hardwarefunktionen, die andere Android-Geräte häufig haben. Aus diesem Grund unterstützt das Android-System die folgenden Funktionen auf Fernsehern 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 haben ein Mikrofon. Dies entspricht nicht der hier beschriebenen Mikrofonhardware-Funktion. Das Mikrofon des Controllers wird vollständig unterstützt.

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

Hardwareanforderungen für Fernseher angeben

Für Android-Apps können im App-Manifest Anforderungen an Hardwarefunktionen deklariert werden, um sicherzustellen, dass sie nicht auf Geräten installiert werden, die diese Funktionen nicht bieten. Wenn du eine bestehende App für die Verwendung auf Fernsehern erweiterst, solltest du das Manifest deiner App sorgfältig auf Deklarationen über Hardwareanforderungen prüfen, die die Installation auf einem Fernseher verhindern könnten.

Wenn deine App Hardwarefunktionen wie Touchscreen oder Kamera verwendet, die auf Fernsehern nicht verfügbar sind, aber ohne diese Funktionen verwendet werden kann, ändere das Manifest deiner App, um anzugeben, dass diese Funktionen nicht erforderlich sind. Das folgende Manifest-Code-Snippet zeigt, wie du erklärst, dass für deine App keine Hardwarefunktionen erforderlich sind, die auf Fernsehern nicht verfügbar sind, diese Funktionen jedoch auf anderen Geräten verwendet werden:

<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 Funktionen haben Unterfunktionen wie android.hardware.camera.front, wie in der Referenz zu Features beschrieben. Achten Sie darauf, alle Subfeatures, die auch in Ihrer App verwendet werden, als required="false" zu markieren.

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

Achtung:Wenn du eine Hardwarefunktion wie erforderlich durch Festlegen des Werts auf true deklarierst, wird deine App nicht auf Fernsehern installiert oder im Launcher des Android TV-Startbildschirms angezeigt.

Achten Sie auf Berechtigungen, die Hardwarefunktionen implizieren

Einige uses-permission-Manifestdeklarationen sind lediglich Hardwarefunktionen. Das bedeutet, dass die Anforderung einiger Berechtigungen in deinem App-Manifest dazu führen kann, dass deine App nicht auf Fernsehern installiert und verwendet werden kann. Die folgenden, häufig angeforderten Berechtigungen erfordern implizite Hardwarefunktionen:

Berechtigung Implizite 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 Fernsehgeräte haben nur eine Ethernet-Verbindung.

Eine vollständige Liste der Berechtigungsanfragen, für die eine Hardwarefunktion erforderlich ist, findest du im Leitfaden zu uses-feature. Wenn deine App eine der zuvor aufgeführten Funktionen anfordert, füge in deinem Manifest für die implizite Hardwarefunktion eine uses-feature-Deklaration hinzu, die angibt, dass sie 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 Fernsehgerät keine Netzwerkkarte oder keinen GPS-Empfänger hat.

Nachdem Sie Hardwarefunktionen für Ihre App optional gemacht haben, müssen Sie die Verfügbarkeit dieser Funktionen während der Laufzeit prüfen und dann das Verhalten Ihrer App anpassen. Im nächsten Abschnitt wird erläutert, wie Sie nach Hardwarefunktionen suchen können. Außerdem werden einige Ansätze zum Ändern des Verhaltens Ihrer Anwendung vorgeschlagen.

Weitere Informationen zum Filtern und Deklarieren von Funktionen im Manifest findest du in der Anleitung zu uses-feature.

Auf Hardwarefunktionen prüfen

Das Android-Framework informiert dich, wenn auf dem Gerät, auf dem deine App ausgeführt wird, keine Hardwarefunktionen verfügbar sind. Verwenden Sie die Methode hasSystemFeature(String), um zur Laufzeit nach bestimmten Features zu suchen. Diese Methode verwendet ein einzelnes Stringargument, das das zu prüfende Element 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 keinen Touchscreen haben, unterstützt Android keine Touchscreen-Interaktion für Fernseher. Außerdem ist die Verwendung eines Touchscreens nicht konsistent mit einer Anzeigeumgebung, in der der Nutzer 3 Meter vom Display entfernt sitzt. Achte darauf, dass die UI-Elemente und der Text nicht die Verwendung eines Touchscreens voraussetzen oder implizieren.

Entwickle deine App für Fernsehgeräte so, dass sie die Navigation über eine Richtungstasten (Steuerkreuz) auf einer TV-Fernbedienung unterstützt. Weitere Informationen zur ordnungsgemäßen Unterstützung der Navigation mithilfe von Steuerelementen für den Fernseher findest du unter TV-Navigation.

Kamera

Fernseher haben normalerweise keine Kamera. Auf einem Fernseher kannst du aber eine Fotografie-App anbieten. Wenn du beispielsweise eine App hast, die Fotos aufnimmt, ansieht und bearbeitet, kannst du die Aufnahmefunktion für Fernseher deaktivieren. Nutzer können dann weiterhin Fotos ansehen und bearbeiten. Wenn du deine kamerabezogene App für einen Fernseher aktivieren möchtest, füge in deinem App-Manifest die folgende Funktiondeklaration hinzu:

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

Wenn Ihre App ohne Kamera ausgeführt werden kann, fügen Sie Ihrer App Code hinzu, der erkennt, ob die Kamerafunktion verfügbar ist, und Anpassungen an der Funktionsweise Ihrer App vornehmen. Im folgenden Codebeispiel wird gezeigt, wie das Vorhandensein einer Kamera erkannt wird:

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 keine GPS-Empfänger (Global Positioning System). Wenn deine App Standortinformationen verwendet, kannst du Nutzern trotzdem die Möglichkeit geben, nach einem Standort zu suchen, 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 der Bildschirm deaktiviert und Android TV läuft weiter im Hintergrund. Die Audioausgabe ist auch in diesem Modus aktiviert. Beenden Sie daher alle aktuell wiedergegebenen Inhalte, wenn sich das Gerät im Energiesparmodus befindet.

Wenn Sie die Wiedergabe im Energiesparmodus verhindern möchten, ü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 das Gerät wieder einschaltet, wird onStart() aufgerufen, wenn Ihre App die aktive App im Vordergrund ist. Weitere Informationen zum Starten und Beenden einer Aktivität finden Sie unter Aktivitätslebenszyklus.