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 |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
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.