Obsługa sprzętu telewizyjnego

Telewizor 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 telewizyjnych, muszą używać pilota lub pada do gier. Aby poznać różne metody wprowadzania, przeczytaj artykuł Zarządzanie kontrolerami telewizora.

Tworząc aplikację na telewizor, uważnie weź pod uwagę ograniczenia sprzętowe i wymagania związane z używaniem sprzętu na telewizorze. Sprawdź, czy aplikacja działa na telewizorze i czy obsługuje nieobsługiwane funkcje sprzętowe.

Sprawdź, czy telewizor jest dostępny

Jeśli tworzysz aplikację, która działa zarówno na telewizorach, jak i na innych urządzeniach, konieczne może być sprawdzenie, na jakim urządzeniu działa aplikacja, i dostosowanie działania aplikacji. Jeśli na przykład masz aplikację, którą można uruchomić za pomocą Intent, sprawdź właściwości urządzenia i zdecyduj, czy chcesz rozpocząć aktywność związaną z telewizorem czy telefonem.

Zalecanym sposobem sprawdzenia, czy aplikacja działa na telewizorze, jest użycie metody PackageManager.hasSystemFeature() w celu sprawdzenia, czy urządzenie działa w trybie telewizora. Ten 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 rozwiązać problem z niedostępnymi funkcjami sprzętowymi. W tej sekcji omawiamy, które funkcje sprzętowe zwykle nie są dostępne na telewizorze, jak wykryć brakujące funkcje sprzętowe i jakie są sugerowane alternatywy.

Nieobsługiwane funkcje sprzętu telewizyjnego

Telewizory pełnią inne funkcje niż pozostałe urządzenia, więc nie mają funkcji sprzętowych, które często mają inne urządzenia z Androidem. Dlatego system Android nie obsługuje tych funkcji telewizora:

Urządzenie Deskryptor funkcji Androida
Ekran dotykowy android.hardware.touchscreen
Emulator ekranu dotykowego android.hardware.faketouch
Telefonia android.hardware.telephony
Aparat android.hardware.camera
Komunikacja Near Field Communications (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 TV są wyposażone w mikrofon, który różni się od opisanej tutaj funkcji mikrofonu. 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 dotyczących telewizora

Aplikacje na Androida mogą zadeklarować wymagania dotyczące funkcji sprzętowych w pliku manifestu aplikacji, aby mieć pewność, że nie są one zainstalowane na urządzeniach, które nie zapewniają tych funkcji. Jeśli rozszerzasz dotychczasową aplikację na telewizory, dokładnie sprawdź jej plik manifestu pod kątem deklaracji wymagań sprzętowych, które mogą uniemożliwiać instalację aplikacji na telewizorze.

Jeśli Twoja aplikacja korzysta z funkcji sprzętowych, takich jak ekran dotykowy lub aparat, które nie są dostę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 korzystają z 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 zawierają podfunkcje, np. android.hardware.camera.front, które opisaliśmy w Informacjach o funkcjach. Pamiętaj, by oznaczyć wszystkie podfunkcje również używane w Twojej aplikacji jako required="false".

Wszystkie aplikacje przeznaczone do używania na telewizorach muszą zadeklarować, że funkcja ekranu dotykowego nie jest wymagana. Więcej informacji na ten temat znajdziesz w artykule Pierwsze kroki z aplikacjami na telewizory. Jeśli Twoja aplikacja zwykle używa co najmniej jednej funkcji, która nie jest obsługiwana przez urządzenia telewizyjne, zmień ustawienie atrybutu android:required na false dla tych funkcji w pliku manifestu.

Uwaga: zadeklarowanie wymaganej funkcji sprzętowej przez ustawienie jej wartości na true uniemożliwia instalowanie aplikacji na telewizorach i wyświetlanie jej w programie uruchamiającym na ekranie głównym Androida TV.

Pamiętaj o uprawnieniach, które sugerują funkcje sprzętowe

Niektóre deklaracje w pliku manifestu uses-permission oznaczają funkcje sprzętowe. Oznacza to, że prośba o niektóre uprawnienia w manifeście aplikacji może uniemożliwić jej instalowanie i używanie na urządzeniach telewizyjnych. Te często wymagane uprawnienia tworzą niejawne wymaganie dotyczące funkcji sprzętowych:

Uprawnienia Domniemana 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 mogą mieć tylko połączenie Ethernet.

Pełną listę próśb o przyznanie uprawnień, które wymagają korzystania z funkcji sprzętowych, znajdziesz w przewodniku po uses-feature. Jeśli Twoja aplikacja prosi o jedną z wymienionych wcześniej funkcji, umieść w pliku manifestu deklarację uses-feature dla domniemanej funkcji sprzętowej, która wskazuje, że nie jest ona wymagana. android:required="false".

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

Jeśli ustawisz w aplikacji funkcje sprzętowe jako opcjonalne, musisz sprawdzić ich dostępność w czasie działania, a następnie dostosować działanie aplikacji. W następnej sekcji omawiamy, jak sprawdzić funkcje sprzętowe, i podpowiadamy, jak zmienić działanie aplikacji.

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

Sprawdź funkcje sprzętowe

Platforma Androida może sprawdzić, czy funkcje sprzętowe nie są dostępne na urządzeniu, na którym działa Twoja aplikacja. Aby sprawdzić dostępność określonych funkcji w czasie działania, użyj metody hasSystemFeature(String). Ta metoda przyjmuje pojedynczy argument tekstowy określający funkcję, którą chcesz sprawdzić.

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

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 ekranów dotykowych, dlatego Android nie obsługuje interakcji z ekranem dotykowym na telewizorach. Poza tym korzystanie z ekranu dotykowego jest niezgodne z miejscami, w których użytkownik siedzi w odległości 3 metrów od wyświetlacza. Dopilnuj, aby elementy interfejsu i tekst nie wymagały ani nie podpowiadały użycia ekranu dotykowego.

W przypadku urządzeń telewizyjnych zaprojektuj aplikację tak, aby obsługiwała nawigację za pomocą pada kierunkowego (pada kierunkowego) na pilocie telewizora. Więcej informacji o prawidłowej obsłudze nawigacji za pomocą elementów sterujących odtwarzaniem na telewizorze znajdziesz w artykule o nawigacji na telewizorze.

Aparat

Telewizor zazwyczaj nie ma aparatu, ale możesz umieścić na nim aplikację związaną z fotografią. Jeśli na przykład Twoja aplikacja robi, wyświetla i edytuje zdjęcia, możesz wyłączyć funkcję robienia zdjęć na telewizorach, a jednocześnie zezwolić użytkownikom na wyświetlanie, a nawet edytowanie zdjęć. Jeśli zdecydujesz, że aplikacja związana z aparatem będzie działać na telewizorze, dodaj w pliku manifestu tę deklarację funkcji:

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

Jeśli zezwolisz aplikacji na uruchamianie bez kamery, dodaj do niej kod, który wykrywa dostępność funkcji kamery i wprowadza zmiany w działaniu aplikacji. Ten przykładowy kod pokazuje, jak wykryć obecność kamery:

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 nieruchome, przeznaczone do użytku wewnątrz budynków i nie mają wbudowanych odbiorników GPS. Jeśli Twoja aplikacja korzysta z informacji o lokalizacji, nadal możesz zezwolić użytkownikom na wyszukiwanie lokalizacji lub korzystać z usług dostawcy statycznej lokalizacji, np. kodu pocztowego skonfigurowanego podczas konfiguracji 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);
}

Wstrzymaj odtwarzanie w trybie oszczędzania energii

Niektóre urządzenia telewizyjne obsługują tryb oszczędzania energii, gdy użytkownik wyłącza urządzenie. Zamiast wyłączania, urządzenie wyłącza wyświetlacz, a Android TV działa w tle. W tym trybie wyjście audio jest nadal włączone, więc zatrzymuj odtwarzanie treści, gdy urządzenie działa w trybie oszczędzania energii.

Aby uniknąć odtwarzania w trybie oszczędzania energii, zastąp ustawienie onStop() i zatrzymaj wszystkie aktualnie odtwarzane 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, wywoływana jest funkcja onStart(), jeśli Twoja aplikacja jest aktywną aplikacją na pierwszym planie. Więcej informacji o rozpoczynaniu i zatrzymywaniu aktywności znajdziesz w sekcji Cykl życia działania.