Obsługa sprzętu telewizyjnego

Telewizor znacznie różni się od innych urządzeń z Androidem. Telewizory nie niektóre funkcje sprzętowe dostępne w innych urządzeniach z Androidem, takie jak ekrany dotykowe, aparatami i odbiornikami GPS. Telewizory są też całkowicie zależne od dodatkowych urządzeń: aby użytkownicy mogli korzystać z aplikacji telewizyjnych, muszą używać pilota lub pada do gier. (Aby dowiedzieć się więcej na temat: różne metody wprowadzania znajdziesz w artykule Zarządzanie kontrolerami telewizora).

Tworząc aplikację na telewizor, uważnie weź pod uwagę ograniczenia sprzętowe i wymagania na sprzęcie telewizyjnym. Sprawdź, czy aplikacja działa na telewizorze i nie jest obsługiwany funkcje sprzętowe.

Sprawdź, czy telewizor jest dostępny

Jeśli tworzysz aplikację, która działa zarówno na telewizorze, jak i na innych urządzeniach, sprawdzić, na jakim urządzeniu działa Twoja aplikacja, i dostosować jej działanie; Dla: na przykład aplikację, którą można uruchomić za pomocą interfejsu Intent, sprawdź właściwości urządzenia, aby zdecydować, czy uruchomić aktywność związana z telefonem lub aktywność związaną z telefonem.

Aby sprawdzić, czy aplikacja działa na telewizorze, najlepiej użyć metody PackageManager.hasSystemFeature() 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żna dostosować niedostępne funkcje sprzętowe. W tej sekcji omawiamy typowe funkcje sprzętowe, niedostępne na telewizorach, jak wykrywać brakujące funkcje sprzętowe i jakie alternatywne rozwiązania są zalecane tych funkcji.

Nieobsługiwane funkcje sprzętu telewizyjnego

Telewizory mają inne przeznaczenie niż inne urządzenia, więc nie mają funkcji sprzętowych, często są dostępne na innych urządzeniach z Androidem. Z tego powodu system Android nie obsługuje funkcji te funkcje dostępne na telewizorze:

Sprzęt 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, nie jest taka sama jak opisana tutaj funkcja mikrofonu. Mikrofon kontrolera jest w pełni obsługiwane.

Zobacz Dokumentacja funkcji, gdzie znajdziesz pełną listę funkcji, podfunkcji i ich deskryptorów.

Deklarowanie wymagań sprzętowych dotyczących telewizora

Aplikacje na Androida mogą deklarować wymagania dotyczące funkcji sprzętowych w manifeście, aby zapewnić że nie są one instalowane na urządzeniach, które nie zapewniają tych funkcji. Jeśli przedłużasz istniejący adres do używania na telewizorze, dokładnie sprawdź plik manifestu pod kątem wymagań sprzętowych które mogą uniemożliwiać jej zainstalowanie na telewizorze.

Jeśli aplikacja używa funkcji sprzętowych, takich jak ekran dotykowy lub aparat, które są niedostępne na TV, ale może działać bez tych funkcji. Zmodyfikuj plik manifestu aplikacji, wskazuje, że te funkcje nie są wymagane. Ten fragment kodu manifestu pokazuje, jak zadeklarować, że aplikacja nie wymaga niedostępnych funkcji sprzętowych na telewizorach, ale są używane 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, takie jak android.hardware.camera.front, zgodnie z opisem w Dokumentacja funkcji Pamiętaj, by oznaczyć wszystkie podfunkcje również używane w Twojej aplikacji jako required="false".

Wszystkie aplikacje przeznaczone do użytku na telewizorach muszą zadeklarować, że funkcja ekranu dotykowego nie jest wymagana. zgodnie z opisem w sekcji Pierwsze kroki z programem Aplikacje TV. Jeśli aplikacja zazwyczaj korzysta z co najmniej jednej funkcji, która nie jest obsługiwana przez telewizor, zmień Ustawienie atrybutu android:required na false dla tych funkcji w pliku manifestu.

Uwaga: deklaruj wymagane funkcje sprzętowe, ustawiając wartość na true uniemożliwia zainstalowanie aplikacji na telewizorze urządzeń i wyświetla się w programie uruchamiającym na ekranie głównym Androida TV.

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

Niektóre uses-permission deklaracje w pliku manifestu oznaczają funkcje sprzętowe. Oznacza to, że prośba o uprawnienia w manifeście aplikacji mogą uniemożliwiać jej instalowanie i używanie na telewizorze. urządzenia. Poniższe często wymagane uprawnienia tworzą niejawną funkcję sprzętową wymaganie:

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 (docelowy poziom API 20 lub niższy tylko)

ACCESS_FINE_LOCATION

android.hardware.location

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

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ą podania funkcji sprzętowych, znajdziesz w uses-feature Google. Jeśli aplikacja prosi o jedną z wymienionych wcześniej funkcji, dołącz atrybut uses-feature w pliku manifestu dla domniemanej funkcji sprzętowej, która stwierdza, że nie jest android:required="false"

Uwaga: jeśli aplikacja jest kierowana na Androida 5.0 (poziom interfejsu API 21) lub i używa ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION, użytkownicy nadal mogą instalować nawet jeśli telewizor nie ma karty sieciowej ani GPS-a, odbiorcy.

Po ustawieniu w aplikacji funkcji sprzętowych jako opcjonalnych musisz sprawdzić dostępności tych funkcji w czasie działania, a następnie dostosować działanie aplikacji. Następna sekcja omawia sprawdzanie funkcji sprzętowych i sugeruje metody zmiany zachowanie aplikacji.

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

Sprawdź funkcje sprzętowe

Platforma Androida może wskazać, czy funkcje sprzętowe urządzenia nie są dostępne, jest uruchomiona. Użyj funkcji hasSystemFeature(String) sprawdzania określonych funkcji w czasie działania. Ta metoda przyjmuje pojedynczy argument w postaci ciągu, który określa obiekt, który chcesz sprawdzić.

Poniższy 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 Telewizory. Ponadto korzystanie z ekranu dotykowego jest niezgodne ze środowiskiem wyświetlania, w którym użytkownik siedzi w odległości 3,5 metra od ekranu. Upewnij się, że elementy interfejsu i tekst nie są wymagać ani sugerować użycia ekranu dotykowego.

W przypadku telewizorów zaprojektuj aplikację tak, aby obsługiwała nawigacji za pomocą pada kierunkowego (pada kierunkowego) na pilocie telewizora. Więcej informacji na temat: obsługi nawigacji za pomocą elementów sterujących odtwarzaniem na telewizorze, patrz Nawigacja na telewizorze

Aparat

Telewizor zazwyczaj nie ma aparatu, ale możesz przesłać zdjęcie na telewizorze. Jeśli na przykład masz aplikację, która robi, wyświetla i edytuje zdjęcia, możesz wyłączyć funkcję robienia zdjęć na telewizorach, a jednocześnie pozwolić użytkownikom na wyświetlanie, a nawet edycję zdjęcia. Jeśli chcesz, żeby aplikacja związana z aparatem działała na telewizorze, dodaj ta deklaracja funkcji pliku manifestu aplikacji:

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

Jeśli zezwalasz swojej aplikacji na działanie bez kamery, dodaj do niej kod który wykrywa, czy funkcja kamery jest dostępna, i koryguje działanie . 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 pomieszczeń i nie mają wbudowanego globalnego systemu pozycjonowania (GPS). odbiorców. Jeśli Twoja aplikacja korzysta z informacji o lokalizacji, możesz zezwolić użytkownikom na wyszukiwanie lokalizację lub korzystanie z usług dostawcy lokalizacji statycznej, np. kodu pocztowego skonfigurowanego na telewizorze. konfiguracji.

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 telewizory obsługują tryb oszczędzania energii, gdy użytkownik wyłączy urządzenie. Zamiast tylko się wyłączać, urządzenie wyłącza wyświetlacz, a Android pozostaje Telewizor uruchomiony w tle. W tym trybie wyjście audio jest nadal włączone, więc zatrzymywać wszystkie odtwarzane treści, gdy urządzenie działa w trybie oszczędzania energii.

Aby uniknąć odtwarzania w trybie oszczędzania energii, zastąp 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, wywołana jest funkcja onStart() jeśli Twoja aplikacja jest aktywną aplikacją na pierwszym planie. Więcej informacji o uruchamianiu i zatrzymywaniu aktywność, zobacz Cykl życia działania.