Umgang mit TV-Hardware

Die TV-Hardware unterscheidet sich erheblich von anderen Android-Geräten. Fernseher haben einige der Hardwarefunktionen anderer Android-Geräte nicht, z. B. Touchscreens, Kameras und GPS-Empfänger. Fernseher sind auch vollständig von sekundären Hardwaregeräten abhängig: Nutzer müssen eine Fernbedienung oder ein Gamepad verwenden, um mit TV-Apps zu interagieren. Informationen zu verschiedenen Eingabemethoden finden Sie unter TV-Controller verwalten.

Wenn Sie eine App für Fernseher entwickeln, müssen Sie die Hardwareeinschränkungen und -anforderungen für den Betrieb auf TV-Hardware sorgfältig berücksichtigen. Prüfen Sie, ob Ihre App auf einem Fernseher ausgeführt wird, und behandeln Sie nicht unterstützte Hardwarefunktionen.

Nach einem TV-Gerät suchen

Wenn Sie eine App entwickeln, die sowohl auf TV-Geräten als auch auf anderen Geräten funktioniert, müssen Sie möglicherweise prüfen, auf welchem Gerät Ihre App ausgeführt wird, und den Betrieb Ihrer App entsprechend anpassen. Wenn Sie beispielsweise eine App haben, die über eine Intent, gestartet werden kann, prüfen Sie die Geräteeigenschaften, um zu ermitteln, ob eine TV-orientierte Aktivität oder eine Smartphone-Aktivität gestartet werden soll.

Die empfohlene Methode, um zu ermitteln, ob Ihre App auf einem TV-Gerät ausgeführt wird, ist die Verwendung der PackageManager.hasSystemFeature() Methode, um zu prüfen , ob das Gerät im TV-Modus ausgeführt wird. Der folgende Beispielcode zeigt, wie Sie prüfen können, ob Ihre App auf einem TV-Gerät 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");
}

Nicht unterstützte Hardwarefunktionen behandeln

Je nach Design und Funktionalität Ihrer App können Sie möglicherweise bestimmte Hardwarefunktionen umgehen, die nicht verfügbar sind. In diesem Abschnitt wird erläutert, welche Hardwarefunktionen in der Regel nicht für Fernseher verfügbar sind, wie Sie fehlende Hardwarefunktionen erkennen und welche Alternativen für diese Funktionen vorgeschlagen werden.

Nicht unterstützte TV-Hardwarefunktionen

Fernseher haben einen anderen Zweck als andere Geräte und verfügen daher nicht über Hardwarefunktionen, die andere Android-Geräte häufig haben. Aus diesem Grund unterstützt das Android-System die folgenden Funktionen für ein TV-Gerät 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, das sich nicht von der hier beschriebenen Hardwarefunktion für das Mikrofon unterscheidet. Das Controller-Mikrofon wird vollständig unterstützt.

Eine vollständige Liste der Funktionen, Unterfunktionen und ihrer Deskriptoren finden Sie in der Funktionsreferenz.

Hardwareanforderungen für Fernseher deklarieren

Android-Apps können Hardwarefunktionsanforderungen im App-Manifest deklarieren, um zu verhindern, dass sie auf Geräten installiert werden, die diese Funktionen nicht bieten. Wenn Sie eine vorhandene App für die Verwendung auf einem Fernseher erweitern, prüfen Sie das Manifest Ihrer App sorgfältig auf Deklarationen von Hardwareanforderungen , die die Installation auf einem TV-Gerät verhindern könnten.

Wenn Ihre App Hardwarefunktionen wie einen Touchscreen oder eine Kamera verwendet, die auf Fernsehern nicht verfügbar sind, aber auch ohne diese Funktionen verwendet werden kann, ändern Sie das Manifest Ihrer App, um anzugeben, dass diese Funktionen nicht erforderlich sind. Das folgende Manifest-Code-Snippet zeigt, wie Sie deklarieren, dass Ihre App keine Hardwarefunktionen benötigt, die auf TV-Geräten nicht verfügbar sind, aber diese Funktionen 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 Funktionen haben Unterfunktionen wie android.hardware.camera.front, wie in der Funktionsreferenz beschrieben. Markieren Sie alle Unterfunktionen, die in Ihrer App verwendet werden, auch als required="false".

Alle Apps, die für die Verwendung auf TV-Geräten vorgesehen sind, müssen deklarieren, dass die Touchscreen-Funktion nicht erforderlich ist, wie unter Erste Schritte mit TV-Apps beschrieben. Wenn Ihre App normalerweise eine oder mehrere der Funktionen verwendet, die von TV-Geräten nicht unterstützt werden, ändern Sie die Einstellung des Attributs android:required in false für diese Funktionen in Ihrem Manifest.

Achtung: Wenn Sie eine Hardwarefunktion als erforderlich deklarieren, indem Sie ihren Wert auf true setzen, kann Ihre App nicht auf TV Geräten installiert werden oder im Android TV-Startbildschirm-Launcher angezeigt werden.

Berechtigungen, die Hardwarefunktionen implizieren

Einige uses-permission Manifestdeklarationen implizieren Hardwarefunktionen. Das bedeutet, dass das Anfordern bestimmter Berechtigungen in Ihrem App-Manifest verhindern kann, dass Ihre App auf TV Geräten installiert und verwendet wird. Die folgenden häufig angeforderten Berechtigungen erzeugen eine implizite Hardwarefunktionsanforderung:

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 für Ziel-API-Level 20 oder niedriger )

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (nur für 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 Hardwarefunktionsanforderung implizieren, finden Sie im uses-feature Leitfaden. Wenn Ihre App eine der zuvor aufgeführten Funktionen anfordert, fügen Sie eine uses-feature Deklaration in Ihrem Manifest für die implizierte Hardwarefunktion ein, die angibt, dass sie nicht erforderlich ist. android:required="false".

Hinweis: Wenn Ihre 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 Ihre App trotzdem auf einem TV-Gerät installieren, auch wenn das TV-Gerät keine Netzwerkkarte oder keinen GPS Empfänger hat.

Nachdem Sie Hardwarefunktionen für Ihre App optional gemacht haben, müssen Sie zur Laufzeit prüfen, ob diese Funktionen verfügbar sind, und das Verhalten Ihrer App entsprechend anpassen. Im nächsten Abschnitt wird erläutert, wie Sie nach Hardwarefunktionen suchen, und es werden einige Ansätze zum Ändern des Verhaltens Ihrer App vorgeschlagen.

Weitere Informationen zum Filtern und Deklarieren von Funktionen im Manifest finden Sie im uses-feature Leitfaden.

Nach Hardwarefunktionen suchen

Das Android-Framework kann Ihnen mitteilen, ob Hardwarefunktionen auf dem Gerät, auf dem Ihre App ausgeführt wird, nicht verfügbar sind. Verwenden Sie die hasSystemFeature(String) Methode, um zur Laufzeit nach bestimmten Funktionen zu suchen. Diese Methode verwendet ein einzelnes String-Argument, das die Funktion angibt, nach der Sie suchen möchten.

Das folgende Codebeispiel zeigt, wie Sie die Verfügbarkeit von Hardwarefunktionen zur Laufzeit erkennen:

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

Die meisten TV-Geräte haben keine Touchscreens oder Zeigereingabefunktionen und sind vollständig auf Fernbedienungen mit Steuerkreuz (D-Pad) für die Navigation angewiesen. TV-Apps müssen immer eine Fernbedienung mit Steuerkreuz unterstützen.

Weitere Informationen zur ordnungsgemäßen Unterstützung der Navigation mit TV-freundlichen Steuerelementen finden Sie unter TV-Navigation.

Touch-Unterstützung deklarieren

Einige TV-Geräte unterstützen Zeigerfernbedienungen und Touchscreen-Displays. Ihre App kann Klick-, Hover- und Scroll-Interaktionen wie auf einem Mobilgerät unterstützen, um die Nutzerfreundlichkeit auf Geräten zu verbessern, die diese Funktionen unterstützen.

Wenn Ihre App den Touch-Modus zulässt, können Sie die Touch-Unterstützung deklarieren, indem Sie in Ihrer AndroidManifest.xml android.software.leanback.supports_touch auf true setzen:

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

Hinweis: Auf Geräten, die eine Zeigerfernbedienung unterstützen (z. B. eine Air Mouse oder ein Touchpad), wird dadurch der Cursor- und Touch-Modus aktiviert, anstatt auf die Emulation der Plattformkompatibilität zurückzugreifen. Wenn diese Metadaten nicht angegeben werden, wird standardmäßig false verwendet.

Kamera

Obwohl ein Fernseher in der Regel keine Kamera hat, können Sie trotzdem eine App für die Fotografie auf einem Fernseher anbieten. Wenn Sie beispielsweise eine App haben, mit der Fotos aufgenommen, angesehen und bearbeitet werden können, können Sie die Funktion zum Aufnehmen von Fotos für Fernseher deaktivieren und Nutzern trotzdem ermöglichen, Fotos anzusehen und sogar zu bearbeiten. Wenn Sie Ihre Kamera-App auf einem Fernseher verwenden möchten, fügen Sie Ihrem App-Manifest die folgende Funktionsdeklaration hinzu:

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

Wenn Sie Ihre App ohne Kamera ausführen möchten, fügen Sie Ihrer App Code hinzu, der erkennt, ob die Kamerafunktion verfügbar ist, und die Funktionsweise Ihrer App entsprechend anpasst. Das folgende Codebeispiel zeigt, wie Sie das Vorhandensein 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 keine integrierten GPS-Empfänger (Global Positioning System) . Wenn Ihre App Standortinformationen verwendet, können Sie Nutzern trotzdem ermöglichen, nach einem Standort zu suchen oder einen statischen Standortanbieter wie eine Postleitzahl zu verwenden, die bei der Einrichtung des TV-Geräts 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 herunterzufahren, deaktiviert das Gerät das Display und lässt Android TV im Hintergrund weiterlaufen. Die Audioausgabe ist in diesem Modus weiterhin aktiviert. Beenden Sie daher alle aktuell 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 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 Der Aktivitätslebenszyklus.