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 |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATE CHANGE_WIFI_STATE
|
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.