Cómo controlar hardware de TV

El hardware de TV es muy diferente de otros dispositivos Android. Las TV no incluir algunas de las funciones de hardware que se encuentran en otros dispositivos Android, como pantallas táctiles, cámaras y receptores GPS. Las TV también dependen por completo de dispositivos de hardware secundarios: para que los usuarios interactúen con apps para TV, deben usar un control remoto o un controlador de juegos. (Para obtener más información varios métodos de entrada, consulta Cómo administrar controladores de TV).

Al crear una aplicación para TV, considera cuidadosamente las limitaciones y los requisitos de hardware de que funcionan con hardware de TV. Verifica si la app se ejecuta en una TV y controla las funciones no compatibles las funciones de hardware.

Cómo buscar un dispositivo de TV

Si estás creando una aplicación que funciona tanto en dispositivos de TV como en otros dispositivos, es posible que debas comprobar en qué tipo de dispositivo se ejecuta tu app y ajustar su funcionamiento. Para Por ejemplo, si tienes una app que puede iniciarse mediante un Intent, Comprobar las propiedades del dispositivo para determinar si se debe iniciar una orientación televisiva o una actividad del teléfono.

La forma recomendada de determinar si tu app se ejecuta en un dispositivo de TV es usar el método PackageManager.hasSystemFeature() para comprobarlo. si el dispositivo está funcionando en modo de televisión. El siguiente código de ejemplo muestra cómo verificar si Tu app se ejecuta en un dispositivo de TV:

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");
}

Cómo manejar las funciones de hardware no compatibles

Según el diseño y la funcionalidad de tu aplicación, es posible que puedas evitar ciertos que algunas funciones de hardware no estén disponibles. Esta sección trata sobre las funciones de hardware que se suelen usar no disponible para TV, cómo detectar funciones de hardware faltantes y las alternativas que se sugieren estas funciones.

Funciones no compatibles para hardware de TV

Las TVs tienen un propósito diferente de otros dispositivos, de manera que no tienen funciones de hardware que que suelen tener otros dispositivos con Android. Por este motivo, el sistema Android no admite las siguientes funciones para un dispositivo de TV:

Hardware Descriptor de funciones de Android
Pantalla táctil android.hardware.touchscreen
Emulador de pantalla táctil android.hardware.faketouch
Telefonía android.hardware.telephony
Cámara android.hardware.camera
Comunicación de campo cercano (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Micrófono android.hardware.microphone
Sensores android.hardware.sensor
Pantalla en orientación vertical android.hardware.screen.portrait

Nota: Algunos controles de TV tienen un micrófono, que es no es lo mismo que la función de hardware del micrófono que se describe aquí. El micrófono del controlador está completamente no es compatible.

Consulta el Referencia de las funciones para obtener una lista completa de las funciones, las subfunciones y sus descriptores.

Declara los requisitos de hardware para TV

Las apps para Android pueden declarar requisitos de funciones de hardware en el manifiesto de la app para garantizar que no estén instaladas en dispositivos que no ofrecen esas funciones. Si vas a extender un app para usarla en TV, revisa cuidadosamente el manifiesto de tu app para verificar que no haya requisitos de hardware declaraciones que podrían impedir que se instale en un dispositivo de TV.

Si tu app usa funciones de hardware, como una pantalla táctil o una cámara, que no están disponibles en TV, pero esta puede funcionar sin el uso de esas funciones, modifica el manifiesto de la app para que indican que estas funciones no son obligatorias. El siguiente fragmento de código de manifiesto demuestra cómo declarar que tu app no requiere funciones de hardware que no están disponibles en dispositivos de TV, pero usa esas funciones en dispositivos que no son de TV:

<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"/>

Nota: Algunas funciones tienen subfunciones, como android.hardware.camera.front, como se describe en las Referencia de la función. Asegúrate de marcar como required="false" las subfunciones que también se usan en tu app.

Todas las apps creadas para usarse en dispositivos de TV deben declarar que no se requiere la función de pantalla táctil. como se describe en Cómo comenzar a usar Apps para TV. Si tu aplicación normalmente usa una o más de las funciones no compatibles con dispositivos de TV, cambia la La configuración del atributo android:required es false para esas funciones de tu manifiesto.

Precaución: Declarar una función de hardware según sea necesario estableciendo su en true evita que tu app se instale en la TV. o aparecer en el selector de la pantalla principal de Android TV.

Ten en cuenta los permisos que implican funciones de hardware

Algunos uses-permission las declaraciones del manifiesto implican funciones de hardware. Este comportamiento significa que solicitar algunos los permisos del manifiesto de la app pueden impedir que esta se instale y use en TV dispositivos. Los siguientes permisos comúnmente solicitados crean una función de hardware implícita. requisito:

Permiso Función implícita de hardware
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera y
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (nivel de API objetivo 20 o versiones anteriores solo)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (nivel de API objetivo 20 o versiones anteriores solo)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Algunos dispositivos de TV solo tienen conexión Ethernet.

Para obtener una lista completa de solicitudes de permisos que implican un requisito de función de hardware, consulta el uses-feature . Si tu app solicita una de las funciones mencionadas anteriormente, incluye una uses-feature en tu manifiesto para la función de hardware implícita que indica que no está como en los productos necesarios. android:required="false".

Nota: Si tu app se orienta a Android 5.0 (nivel de API 21) o superior y usa el ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION, los usuarios aún pueden instalar tu app en un dispositivo de TV, incluso si este no tiene una tarjeta de red o GPS receptor.

Después de establecer las funciones de hardware como opcionales para tu app, debes verificar la la disponibilidad de esas funciones durante el tiempo de ejecución y, luego, ajustar el comportamiento de tu app. La siguiente sección Analiza cómo comprobar las funciones de hardware y sugiere algunos enfoques para cambiar la de la app.

Para obtener más información sobre cómo filtrar y declarar funciones en el manifiesto, consulta el uses-feature .

Cómo buscar funciones de hardware

El framework de Android puede indicarte si hay funciones de hardware no disponibles en el dispositivo en el que mientras se ejecuta tu app. Usa el hasSystemFeature(String) para comprobar funciones específicas en el tiempo de ejecución. Este método toma un solo argumento de cadena que especifica la función que quieres comprobar.

El siguiente ejemplo de código demuestra cómo detectar la disponibilidad de funciones de hardware. durante el tiempo de ejecución:

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.");
}

Pantalla táctil

Como la mayoría de las TV no tienen pantallas táctiles, Android no admite la interacción con pantallas táctiles para Dispositivos de TV. Además, el uso de una pantalla táctil no es coherente con un entorno de visualización donde el usuario debe estar sentado a 3 metros de distancia de la pantalla. Asegúrate de que los elementos de la interfaz de usuario y el texto no requieran o impliquen el uso de una pantalla táctil.

Para dispositivos de TV, diseña tu app de modo que sea compatible la navegación con un mando de dirección (pad direccional) en un control remoto de TV Para obtener más información cómo admitir la navegación mediante controles compatibles con la TV, consulta Navegación en TV.

Cámara

Si bien las TV no suelen tener cámara, puedes proporcionar imágenes fotográficas en una TV. Por ejemplo, si tienes una app que toma, mira y edita fotos, puedes inhabilitar la función de toma de fotos para TVs y seguir permitiendo que los usuarios vean y editen fotos. Si quieres que tu app relacionada con la cámara funcione en una TV, agrega la siguiente declaración de función en el manifiesto de la app:

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

Si permites que tu app se ejecute sin una cámara, agrega código a ella que detecta si la función de la cámara está disponible y ajusta el funcionamiento de tus . En el siguiente ejemplo de código, se muestra cómo detectar la presencia de una cámara:

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

Las TV son dispositivos fijos, de interior y no tienen un sistema de posicionamiento global (GPS) integrado receptores de llamadas de Google. Si tu app usa información de ubicación, puedes permitir que los usuarios busquen una ubicación o usar un proveedor de ubicación estática, como un código postal configurado durante el dispositivo de TV configuración.

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);
}

Pausa la reproducción durante el modo de bajo consumo

Algunos dispositivos de TV admiten el modo de bajo consumo cuando el usuario apaga el dispositivo. En lugar de apagarse, el dispositivo inhabilita la pantalla y mantiene TV ejecutándose en segundo plano. La salida de audio sigue habilitada en este modo, detener la reproducción de contenido cuando el dispositivo esté en el modo de bajo consumo.

Para evitar la reproducción durante el modo de bajo consumo, anula onStop() y detener cualquier contenido que se esté reproduciendo:

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();
}

Cuando el usuario vuelve a conectar la alimentación, se llama a onStart(). si tu app es la app activa en primer plano. Obtén más información sobre iniciar y detener una actividad, consulta Ciclo de vida de la actividad