Gestire l'hardware della TV

L'hardware della TV � sostanzialmente diverso dagli altri dispositivi Android. Le TV non includono alcune delle funzionalit� hardware presenti su altri dispositivi Android, come i touchscreen, fotocamere e ricevitori GPS. Le TV dipendono completamente anche da dispositivi hardware secondari: per interagire con le app TV, gli utenti devono utilizzare un telecomando o un gamepad. (Per saperne di pi� vari metodi di immissione, vedi Gestire i controller della TV.

Quando crei un'app per la TV, considera con attenzione le limitazioni e i requisiti hardware su hardware TV. Controlla se la tua app � in esecuzione su una TV e gestisci i dispositivi non supportati funzionalit� hardware.

Verifica la presenza di un dispositivo TV

Se stai creando un'app che funziona sia su dispositivi TV che su altri dispositivi, potresti dover controlla il tipo di dispositivo su cui � in esecuzione la tua app e regolane il funzionamento. Per Ad esempio, se hai un'app che pu� essere avviata tramite un Intent, Controllare le propriet� del dispositivo per stabilire se iniziare una un'attivit� fisica o un'attivit� dello smartphone.

Il metodo consigliato per determinare se la tua app � in esecuzione su un dispositivo TV � usare il metodo PackageManager.hasSystemFeature() per controllare se il dispositivo � in modalit� televisione. Il seguente codice di esempio mostra come verificare se la tua app � in esecuzione su un dispositivo 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");
}

Gestire le funzionalit� hardware non supportate

A seconda della progettazione e della funzionalit� dell'app, potresti riuscire ad aggirare alcuni funzionalit� hardware non disponibili. Questa sezione illustra le caratteristiche tipiche dell'hardware non disponibile per la TV, come rilevare funzionalit� hardware mancanti e quali alternative vengono suggerite queste funzionalit�.

Funzionalit� hardware TV non supportate

Le TV hanno uno scopo diverso dagli altri dispositivi, quindi non dispongono di funzionalit� hardware che spesso hanno altri dispositivi Android. Per questo motivo, il sistema Android non supporta le seguenti funzionalit� per un dispositivo TV:

Hardware Descrittore delle funzionalit� Android
Touchscreen android.hardware.touchscreen
Emulatore touchscreen android.hardware.faketouch
Telefonia android.hardware.telephony
Fotocamera android.hardware.camera
Near Field Communication (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Microfono android.hardware.microphone
Sensori android.hardware.sensor
Schermo con orientamento verticale android.hardware.screen.portrait

Nota:alcuni controller TV sono dotati di un microfono, non corrisponde alla funzionalit� hardware del microfono descritta qui. Il microfono del controller � completamente supportati.

Consulta Riferimento alle funzionalit� per un elenco completo di funzionalit�, funzionalit� secondarie e descrittori.

Dichiarare i requisiti hardware per la TV

Le app per Android possono dichiarare i requisiti relativi alle funzionalit� hardware nel file manifest dell'app per garantire che non sono installati su dispositivi che non le forniscono. Se intendi estendere un modello esistente per l'uso sulla TV, esamina attentamente il file manifest dell'app per verificare la presenza di eventuali requisiti hardware dichiarazioni che potrebbero impedirne l'installazione su un dispositivo TV.

Se la tua app usa funzionalit� hardware non disponibili sul touchscreen o una fotocamera TV, ma pu� funzionare senza utilizzare queste funzionalit�, modificare il file manifest dell'app in indicano che queste funzionalit� non sono obbligatorie. Il seguente snippet di codice manifest dimostra come dichiarare che la tua app non richiede funzionalit� hardware non disponibili sui dispositivi TV, ma utilizza queste funzionalit� su dispositivi diversi dalla 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:alcune funzionalit� includono funzionalit� secondarie, ad esempio android.hardware.camera.front, come descritto in Informazioni sulle funzionalit�. Assicurati di contrassegnare tutte le funzionalit� secondarie utilizzate anche nella tua app come required="false".

Tutte le app destinate all'uso sui dispositivi TV devono dichiarare che la funzionalit� touchscreen non � necessaria. come descritto nella Guida introduttiva all'utilizzo di App TV. Se normalmente la tua app utilizza una o pi� funzionalit� non supportate dai dispositivi TV, modifica Impostazione dell'attributo android:required su false per queste funzionalit� nel file manifest.

Attenzione:dichiara una funzionalit� hardware come richiesto impostandone pari a true impedisce l'installazione dell'app sulla TV dispositivi o che appaiono nell'Avvio app della schermata Home di Android TV.

Presta attenzione alle autorizzazioni che implicano funzionalit� hardware

Alcune uses-permission le dichiarazioni del file manifest implicano le funzionalit� hardware. Questo comportamento significa che la richiesta le autorizzazioni nel file manifest dell'app possono impedire l'installazione e l'utilizzo della tua app sulla TV dispositivi mobili. Le seguenti autorizzazioni richieste comunemente creano una funzionalit� hardware implicita requisito:

Autorizzazione Funzionalit� hardware implicita
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera e
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (livello API target 20 o precedente) )

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (livello API target 20 o precedente) )

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Alcuni dispositivi TV dispongono solo di una connessione Ethernet.

Per un elenco completo delle richieste di autorizzazione che implicano un requisito per le funzionalit� hardware, consulta le uses-feature guida. Se la tua app richiede una delle funzionalit� elencate in precedenza, includi una uses-feature una dichiarazione nel file manifest per la funzionalit� hardware implicita che indica che non si obbligatorio. android:required="false".

Nota:se la tua app ha come target Android 5.0 (livello API 21) oppure e utilizza ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION, gli utenti possono comunque installare su un dispositivo TV, anche se il dispositivo TV non dispone di una scheda di rete o di un GPS destinatario.

Dopo aver reso facoltative le funzionalit� hardware per la tua app, devi controllare la disponibilit� di queste funzionalit� in fase di runtime, quindi modifica il comportamento dell'app. La sezione successiva illustra come verificare le funzionalit� hardware e suggerisce alcuni approcci per cambiare comportamento dell'app.

Per ulteriori informazioni su come filtrare e dichiarare le caratteristiche nel file manifest, consulta uses-feature guida.

Verificare le funzionalit� hardware

Il framework Android � in grado di indicare se le funzionalit� hardware non sono disponibili sul dispositivo su cui la tua app � in esecuzione. Usa hasSystemFeature(String) per controllare funzionalit� specifiche in fase di runtime. Questo metodo prende un singolo argomento stringa specifica la caratteristica che vuoi controllare.

Il seguente esempio di codice mostra come rilevare la disponibilit� delle funzionalit� hardware in fase di esecuzione:

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

Poich� la maggior parte delle TV non dispone di touchscreen, Android non supporta l'interazione con il touchscreen per Dispositivi TV. Inoltre, l'uso di un touchscreen non � coerente con un ambiente di visualizzazione in cui l'utente � seduto a 3 metri di distanza dal display. Assicurati che gli elementi dell'interfaccia utente e il testo non richiedono o implicano l'uso di un touchscreen.

Per i dispositivi TV, progetta la tua app in modo che supporti la navigazione usando un pad direzionale (D-pad) sul telecomando di una TV. Per ulteriori informazioni supportare correttamente la navigazione con controlli compatibili con la TV; consulta Navigazione TV.

Fotocamera

Anche se una TV in genere non dispone di una videocamera, puoi comunque fornire una foto su una TV. Ad esempio, se hai un'app che richiede, visualizza e modifica foto, puoi disattivare la funzionalit� di scatto delle foto per la TV e consentire agli utenti di visualizzare e persino modificare foto. Se decidi di consentire il funzionamento dell'app relativa alla fotocamera su una TV, aggiungi l' seguente dichiarazione relativa alla funzionalit� nel file manifest dell'app:

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

Se consenti l'esecuzione dell'app senza videocamera, aggiungi il codice all'app che rileva se la funzione della videocamera � disponibile e regola il funzionamento del dell'app. Il seguente esempio di codice mostra come rilevare la presenza di una videocamera:

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

Le TV sono dispositivi fissi all'interno e non dispongono di un sistema di posizionamento globale (GPS) integrato o ricevitori. Se la tua app utilizza informazioni sulla posizione, puoi comunque consentire agli utenti di cercare una posizione o utilizzare un fornitore di servizi di localizzazione statico come un codice postale configurato durante il dispositivo TV configurazione.

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

Mettere in pausa la riproduzione in modalit� a basso consumo

Alcuni dispositivi TV supportano la modalit� a basso consumo quando l'utente spegne il dispositivo. Anzich� arrestarsi, il dispositivo disattiva il display e mantiene Android TV in esecuzione in background. L'uscita audio � ancora attiva in questa modalit�, quindi interrompere i contenuti attualmente in riproduzione quando il dispositivo � in modalit� a basso consumo.

Per evitare la riproduzione in modalit� a basso consumo, sostituisci onStop() e interrompi i contenuti in riproduzione:

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 l'utente riattacca la corrente, viene chiamato onStart() se la tua app � l'app attiva in primo piano. Per ulteriori informazioni su come avviare e interrompere un'attivit�, vedi Il ciclo di vita dell'attivit�.