O hardware de TV é substancialmente diferente de outros dispositivos Android. As TVs não incluem alguns dos recursos de hardware de outros dispositivos Android, como touchscreens, câmeras e receptores de GPS. TVs também são completamente dependentes de dispositivos de hardware secundários: para que os usuários interajam com apps de TV, eles precisam usar um controle remoto ou um gamepad. Para saber mais sobre diversos métodos de entrada, consulte Gerenciar controles de TV.
Ao criar um app para TV, considere cuidadosamente as limitações e os requisitos de hardware do que opera no hardware da TV. Conferir se o app está sendo executado em uma TV e se o identificador não é compatível recursos de hardware.
Verificar se há um dispositivo de TV
Se você estiver criando um aplicativo que funcione na TV e em outros dispositivos, pode ser necessário
verifique em que tipo de dispositivo seu app está sendo executado e ajuste o funcionamento dele. Para
Por exemplo, se você tem um app que pode ser iniciado por uma Intent
,
verifique as propriedades do dispositivo para determinar se deve iniciar um anúncio
atividade física ou no smartphone.
A maneira recomendada de determinar se o app está sendo executado em um dispositivo de TV é usar o método PackageManager.hasSystemFeature()
para verificar
se o dispositivo está sendo executado no modo televisão. O código de exemplo a seguir mostra como verificar se
seu app está sendo executado em um 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"); }
Lidar com recursos de hardware incompatíveis
Dependendo do design e da funcionalidade do app, é possível contornar algumas recursos de hardware indisponíveis. Esta seção discute quais recursos de hardware são normalmente não está disponível para TV, como detectar recursos de hardware ausentes e que alternativas são sugeridas para esses recursos.
Recursos de hardware de TV incompatíveis
TVs têm uma funcionalidade diferente de outros dispositivos, por isso não têm recursos de hardware que outros dispositivos Android costumam ter. Por isso, o sistema Android não oferece suporte os seguintes recursos para um dispositivo de TV:
Hardware | Descritor de recurso do Android |
---|---|
Touchscreen | android.hardware.touchscreen |
Emulador de touchscreen | android.hardware.faketouch |
Telefonia | android.hardware.telephony |
Câmera | android.hardware.camera |
Comunicação a curta distância (NFC) | android.hardware.nfc |
GPS | android.hardware.location.gps |
Microfone | android.hardware.microphone |
Sensores | android.hardware.sensor |
Tela na orientação retrato | android.hardware.screen.portrait |
Observação:alguns controles de TV têm um microfone, não é o mesmo que o recurso de hardware de microfone descrito aqui. O microfone do controle está totalmente suporte.
Consulte a Referência de recursos para uma lista completa de recursos, recursos secundários e descritores.
Declarar requisitos de hardware para TV
Os apps Android podem declarar requisitos de recursos de hardware no manifesto do app para garantir que para que não sejam instalados em dispositivos que não ofereçam esses recursos. Ao estender uma implantação para uso na TV, revise com cuidado o manifesto do app em busca de requisitos de hardware declarações que possam impedir que ele seja instalado em uma TV.
Se o app usa recursos de hardware, como tela touchscreen ou câmera, que não estão disponíveis no TV, mas pode operar sem o uso desses recursos, modificar o manifesto do app para indicam que esses recursos não são obrigatórios. O snippet de código do manifesto a seguir demonstra como declarar que o app não exige recursos de hardware indisponíveis em dispositivos de TV, mas usa esses recursos em outros dispositivos:
<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"/>
Observação:alguns recursos têm sub-recursos, como android.hardware.camera.front
,
conforme descrito no
Referência de recursos. Marque todos os subrecursos que também são usados no seu app como required="false"
.
Todos os apps destinados ao uso em dispositivos de TV precisam declarar que o recurso de tela touchscreen não é necessário.
conforme descrito em Introdução
Apps de TV. Se o app normalmente usa um ou mais recursos não compatíveis com dispositivos de TV, mude o
Configuração do atributo android:required
como false
para esses recursos no manifesto.
Cuidado:declarar um recurso de hardware como necessário definindo o
O valor como true
impede que o app seja instalado na TV.
ou aparecendo na tela inicial do Android TV.
Cuidado com as permissões que implicam recursos de hardware
Alguns uses-permission
de declarações de manifesto implicam recursos de hardware. Esse comportamento significa que a solicitação
As permissões no manifesto do app podem impedir que ele seja instalado e usado na TV
dispositivos. As seguintes permissões normalmente solicitadas criam um recurso de hardware implícito
requisito:
Permissão | Recurso de hardware afetado |
---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera e android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATE CHANGE_WIFI_STATE
|
Alguns dispositivos de TV só têm conexão Ethernet. |
Para obter uma lista completa de solicitações de permissão que implicam uma exigência de recurso de hardware, consulte a
uses-feature
guia. Caso seu app solicite um dos recursos listados anteriormente, inclua um
uses-feature
no manifesto para o recurso de hardware implícito que indica que ele não é
obrigatórios. android:required="false"
.
Observação:caso seu app seja destinado ao Android 5.0 (nível 21 da API) ou
e usa a API ACCESS_COARSE_LOCATION
ou
ACCESS_FINE_LOCATION
permissão, os usuários ainda podem instalar seu
em um dispositivo de TV, mesmo que ele não tenha uma placa de rede ou um GPS
receptor.
Após tornar os recursos de hardware opcionais para o aplicativo, é necessário verificar o disponibilidade desses recursos no tempo de execução e ajustar o comportamento do aplicativo. A próxima seção discute como verificar os recursos de hardware e sugere algumas abordagens para alterar o comportamento do seu app.
Para mais informações sobre como filtrar e declarar recursos no manifesto, consulte
uses-feature
guia.
Verificar se há recursos de hardware
O framework do Android pode informar se os recursos de hardware não estão disponíveis no dispositivo em que
seu app está em execução. Usar a hasSystemFeature(String)
para verificar recursos específicos no tempo de execução. Esse método usa um único argumento de string que
especifica o atributo que você quer verificar.
O exemplo de código a seguir demonstra como detectar a disponibilidade de recursos de hardware no tempo de execução:
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."); }
Tela touchscreen
Como a maioria das TVs não possui touchscreens, o Android não oferece suporte à interação com touchscreen para Dispositivos de TV. Além disso, o uso de uma tela sensível ao toque não é consistente com um ambiente de visualização em que o usuário está sentado a três metros de distância da tela. Verifique se os elementos da interface do usuário e o texto exigem ou implicam o uso de uma tela sensível ao toque.
Para dispositivos de TV, projete seu app para oferecer suporte navegação usando um botão direcional em um controle remoto de TV. Para mais informações sobre oferecer suporte adequado à navegação usando controles compatíveis com TV; consulte Navegação na TV.
Câmera
Embora uma TV normalmente não tenha câmera, você ainda pode fornecer imagens relacionadas em uma TV. Por exemplo, se você tem um aplicativo que tira, visualiza e edita fotos, você pode desativar a funcionalidade de tirar fotos para TVs e ainda permitir que os usuários visualizem e até mesmo editem fotos. Se você decidir permitir que seu app relacionado à câmera funcione em uma TV, adicione o declaração de recurso abaixo, no manifesto do app:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Se você permitir que seu app seja executado sem uma câmera, adicione um código ao app que detecta se o recurso da câmera está disponível e faz ajustes à operação do seu app. O exemplo de código a seguir demonstra como detectar a presença de uma câmera:
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
TVs são dispositivos estacionários para interiores e não têm sistema de posicionamento global (GPS) integrado receptores. Se o app usa informações de local, você ainda pode permitir que os usuários pesquisem um local ou usar um provedor de localização estática, como um código postal configurado durante a TV configuração da infraestrutura.
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); }
Pausar reprodução no modo de baixo consumo de energia
Alguns dispositivos de TV oferecem um modo de baixo consumo de energia quando o usuário desliga o dispositivo. Em vez de desligar, o dispositivo desativa a tela e mantém o Android TV aberta em segundo plano. A saída de áudio continua ativada nesse modo. interromper qualquer conteúdo em reprodução quando o dispositivo estiver no modo de baixo consumo de energia.
Para evitar reproduções durante o modo de baixo consumo de energia, substitua
onStop()
e interromper qualquer conteúdo em reprodução:
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(); }
Quando o usuário liga a energia novamente, onStart()
é chamado.
se o app for o app em primeiro plano ativo. Para mais informações sobre como iniciar e parar
uma atividade, consulte
O ciclo de vida da atividade.