Obsługa sprzętu telewizyjnego

Sprzęt telewizyjny znacznie różni się od innych urządzeń z Androidem. Telewizory nie mają niektórych funkcji sprzętowych dostępnych w innych urządzeniach z Androidem, takich jak ekrany dotykowe, aparaty i odbiorniki GPS. Telewizory są też całkowicie zależne od dodatkowych urządzeń sprzętowych: Aby użytkownicy mogli korzystać z aplikacji na telewizorze, muszą używać pilota lub gamepada. (Więcej informacji o różnych metodach wprowadzania danych znajdziesz w artykule Zarządzanie kontrolerami telewizora).

Podczas tworzenia aplikacji na telewizor dokładnie rozważ ograniczenia sprzętowe i wymagania dotyczące działania na sprzęcie telewizyjnym. Sprawdź, czy aplikacja działa na telewizorze, i obsługuj nieobsługiwane funkcje sprzętowe.

Sprawdzanie, czy urządzenie to telewizor

Jeśli tworzysz aplikację, która działa zarówno na telewizorach, jak i na innych urządzeniach, może być konieczne sprawdzenie, na jakim urządzeniu działa aplikacja, i dostosowanie jej działania. Jeśli na przykład masz aplikację, którą można uruchomić za pomocą Intent, sprawdź właściwości urządzenia, aby określić, czy uruchomić aktywność przeznaczoną na telewizor, czy na telefon.

Zalecanym sposobem na sprawdzenie, czy aplikacja działa na telewizorze, jest użycie metody PackageManager.hasSystemFeature() , aby sprawdzić , czy urządzenie działa w trybie telewizora. Poniższy przykładowy kod pokazuje, jak sprawdzić, czy aplikacja działa na telewizorze:

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

Obsługa nieobsługiwanych funkcji sprzętowych

W zależności od projektu i funkcjonalności aplikacji możesz obejść brak niektórych funkcji sprzętowych. W tej sekcji omówimy, które funkcje sprzętowe są zwykle niedostępne w telewizorach, jak wykrywać brakujące funkcje sprzętowe i jakie alternatywy są sugerowane dla tych funkcji.

Nieobsługiwane funkcje sprzętowe telewizora

Telewizory mają inne przeznaczenie niż inne urządzenia, dlatego nie mają funkcji sprzętowych, które często mają inne urządzenia z Androidem. Z tego powodu system Android nie obsługuje tych funkcji na telewizorze:

Sprzęt Deskryptor funkcji Androida
Ekran dotykowy android.hardware.touchscreen
Emulator ekranu dotykowego android.hardware.faketouch
Połączenia telefoniczne android.hardware.telephony
Aparat android.hardware.camera
Komunikacja Near Field Communication (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Mikrofon android.hardware.microphone
Czujniki android.hardware.sensor
Ekran w orientacji pionowej android.hardware.screen.portrait

Uwaga: niektóre kontrolery telewizora mają mikrofon, ale nie jest to ta sama funkcja sprzętowa co opisana tutaj. Mikrofon kontrolera jest w pełni obsługiwany.

Pełną listę funkcji, podfunkcji i ich deskryptorów znajdziesz w dokumentacji funkcji.

Deklarowanie wymagań sprzętowych dla telewizora

Aplikacje na Androida mogą deklarować wymagania dotyczące funkcji sprzętowych w pliku manifestu aplikacji, aby nie były instalowane na urządzeniach, które nie mają tych funkcji. Jeśli rozszerzasz istniejącą aplikację do użytku na telewizorze, dokładnie sprawdź plik manifestu aplikacji pod kątem deklaracji wymagań sprzętowych , które mogą uniemożliwić jej zainstalowanie na telewizorze.

Jeśli Twoja aplikacja korzysta z funkcji sprzętowych, takich jak ekran dotykowy lub aparat, które są niedostępne na telewizorze, ale może działać bez tych funkcji, zmodyfikuj plik manifestu aplikacji, aby wskazać, że te funkcje nie są wymagane. Ten fragment kodu manifestu pokazuje, jak zadeklarować, że aplikacja nie wymaga funkcji sprzętowych, które są niedostępne na telewizorach, ale używa tych funkcji na urządzeniach innych niż telewizory:

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

Uwaga: niektóre funkcje mają podfunkcje, takie jak android.hardware.camera.front, jak opisano w dokumentacji funkcji. Pamiętaj, aby oznaczyć wszystkie podfunkcje używane w aplikacji jako required="false".

Wszystkie aplikacje przeznaczone do użytku na telewizorach muszą deklarować, że funkcja ekranu dotykowego nie jest wymagana, jak opisano w artykule Pierwsze kroki z aplikacjami na telewizor. Jeśli Twoja aplikacja zwykle korzysta z co najmniej jednej funkcji, która nie jest obsługiwana przez telewizory, zmień ustawienie atrybutu android:required na false w przypadku tych funkcji w pliku manifestu.

Uwaga: zadeklarowanie funkcji sprzętowej jako wymaganej przez ustawienie jej wartości na true uniemożliwia zainstalowanie aplikacji na telewizorach lub wyświetlenie jej w launcherze ekranu głównego Androida TV.

Informacje o uprawnieniach, które implikują funkcje sprzętowe

Niektóre uses-permission deklaracje w pliku manifestu implikują funkcje sprzętowe. Oznacza to, że żądanie niektórych uprawnień w pliku manifestu aplikacji może uniemożliwić jej zainstalowanie i używanie na telewizorach. Te często wymagane uprawnienia tworzą domyślne wymaganie dotyczące funkcji sprzętowej wymaganie:

Uprawnienie Implikowana funkcja sprzętowa
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera i
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (tylko docelowy poziom interfejsu API 20 lub niższy )

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (tylko docelowy poziom interfejsu API 20 lub niższy )

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Niektóre telewizory mają tylko połączenie Ethernet.

Pełną listę żądań uprawnień, które implikują wymaganie dotyczące funkcji sprzętowej, znajdziesz w uses-feature przewodniku. Jeśli Twoja aplikacja wymaga jednej z wymienionych wcześniej funkcji, dodaj do pliku manifestu deklarację uses-feature dla implikowanej funkcji sprzętowej, która wskazuje, że nie jest wymagana. android:required="false".

Uwaga: jeśli Twoja aplikacja jest przeznaczona na Androida 5.0 (poziom interfejsu API 21) lub nowszego i korzysta z uprawnienia ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION, użytkownicy mogą zainstalować ją na telewizorze, nawet jeśli nie ma on karty sieciowej ani odbiornika GPS.

Gdy funkcje sprzętowe staną się opcjonalne dla Twojej aplikacji, musisz sprawdzić ich dostępność w czasie działania aplikacji, a następnie dostosować jej działanie. W następnej sekcji dowiesz się, jak sprawdzić funkcje sprzętowe, i poznasz kilka sposobów na zmianę działania aplikacji.

Więcej informacji o filtrowaniu i deklarowaniu funkcji w pliku manifestu znajdziesz w uses-feature przewodniku.

Sprawdzanie funkcji sprzętowych

Platforma Android może poinformować Cię, czy funkcje sprzętowe są niedostępne na urządzeniu, na którym działa Twoja aplikacja. Aby sprawdzić konkretne funkcje w czasie działania aplikacji, użyj metody hasSystemFeature(String). Ta metoda przyjmuje 1 argument w postaci ciągu znaków, który określa funkcję, którą chcesz sprawdzić.

Ten przykład kodu pokazuje, jak wykryć dostępność funkcji sprzętowych w czasie działania aplikacji:

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

Ekran dotykowy

Większość telewizorów nie ma ekranu dotykowego ani możliwości wprowadzania danych za pomocą wskaźnika i w pełni polega na pilotach z padem kierunkowym. Aplikacje na telewizor muszą zawsze obsługiwać pilota z padem kierunkowym.

Więcej informacji o prawidłowej obsłudze nawigacji za pomocą elementów sterujących dostosowanych do telewizora znajdziesz w artykule Nawigacja na telewizorze.

Deklarowanie obsługi dotyku

Niektóre telewizory obsługują piloty ze wskaźnikiem i ekrany dotykowe. Aplikacja może obsługiwać kliknięcia, najechania kursorem i przewijanie, tak jak na urządzeniu mobilnym, aby zapewnić lepsze wrażenia na urządzeniach które obsługują te funkcje.

Jeśli Twoja aplikacja obsługuje tryb dotykowy, możesz zadeklarować obsługę dotyku, dodając android.software.leanback.supports_touch z wartością true w pliku AndroidManifest.xml:

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

Uwaga: na urządzeniach, które obsługują pilota ze wskaźnikiem (np. mysz powietrzną lub trackpad), włączenie tej opcji powoduje włączenie trybu kursora i dotyku zamiast emulacji zgodności z platformą. Jeśli pominiesz te metadane, domyślnie przyjmą one wartość false.

Aparat

Chociaż telewizor zwykle nie ma aparatu, możesz udostępnić na nim aplikację związaną z fotografią. Jeśli na przykład masz aplikację, która robi, wyświetla i edytuje zdjęcia, możesz wyłączyć jej funkcję robienia zdjęć na telewizorach, ale nadal umożliwiać użytkownikom wyświetlanie, a nawet edytowanie zdjęć. Jeśli zdecydujesz się włączyć aplikację związaną z aparatem, aby działała na telewizorze, dodaj do pliku manifestu aplikacji tę deklarację funkcji:

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

Jeśli włączysz aplikację, aby działała bez aparatu, dodaj do niej kod który wykrywa, czy funkcja aparatu jest dostępna, i dostosowuje działanie aplikacji. Ten przykład kodu pokazuje, jak wykryć obecność aparatu:

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

Telewizory to urządzenia stacjonarne, które znajdują się w pomieszczeniach i nie mają wbudowanych odbiorników GPS. Jeśli Twoja aplikacja korzysta z informacji o lokalizacji, możesz nadal umożliwiać użytkownikom wyszukiwanie lokalizacji lub korzystanie ze statycznego dostawcy lokalizacji, takiego jak kod pocztowy skonfigurowany podczas konfigurowania telewizora.

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

Wstrzymywanie odtwarzania w trybie oszczędzania energii

Niektóre telewizory obsługują tryb oszczędzania energii, gdy użytkownik wyłączy urządzenie. Zamiast wyłączać się, urządzenie wyłącza wyświetlacz i utrzymuje działanie Androida TV w tle. W tym trybie nadal jest włączone wyjście audio, więc zatrzymaj odtwarzanie treści, gdy urządzenie jest w trybie oszczędzania energii.

Aby uniknąć odtwarzania w trybie oszczędzania energii, zastąp metodę onStop() i zatrzymaj odtwarzanie treści:

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

Gdy użytkownik ponownie włączy zasilanie, zostanie wywołana metoda onStart() jeśli Twoja aplikacja jest aktywną aplikacją (działającą) na pierwszym planie. Więcej informacji o uruchamianiu i zatrzymywaniu aktywności znajdziesz w artykule Cykl życia działania.