Телевизоры значительно отличаются от других устройств Android. В телевизорах нет некоторых аппаратных компонентов, которые есть в других устройствах Android, например сенсорных экранов, камер и GPS-приемников. Телевизоры также полностью зависят от дополнительных устройств. Чтобы взаимодействовать с приложениями на телевизоре, пользователям необходимо использовать пульт дистанционного управления или геймпад. Подробнее об управлении телевизором…
При разработке приложения для телевизора учитывайте ограничения и требования к аппаратному обеспечению. Проверьте, запущено ли приложение на телевизоре, и обработайте неподдерживаемые аппаратные функции.
Как проверить, есть ли телевизор
Если вы разрабатываете приложение, которое работает на телевизорах и других устройствах, вам может понадобиться проверить, на каком устройстве оно запущено, и скорректировать его работу. Например, если у вас есть приложение, которое можно запустить с помощью Intent, проверьте свойства устройства, чтобы определить, нужно ли запускать объект activity, ориентированный на телевизор, или объект activity, ориентированный на телефон.
Рекомендуемый способ определить, запущено ли приложение на телевизоре, – использовать метод PackageManager.hasSystemFeature, чтобы проверить, работает ли устройство в режиме телевизора. В примере кода ниже показано, как проверить, запущено ли приложение на телевизоре:
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"); }
Как обрабатывать неподдерживаемые функции оборудования
В зависимости от дизайна и функциональности приложения вы можете обойтись без некоторых аппаратных функций. В этом разделе рассказывается о том, какие аппаратные функции обычно недоступны на телевизорах, как определить, что они отсутствуют, и какие альтернативы можно использовать.
Неподдерживаемые функции оборудования телевизора
Телевизоры предназначены для других целей, поэтому у них нет аппаратных функций, которые часто встречаются на других устройствах с ОС Android. По этой причине на телевизорах с Android не поддерживаются следующие функции:
| Аппаратное обеспечение | Дескриптор функции Android |
|---|---|
| Сенсорный экран | android.hardware.touchscreen |
| Эмулятор сенсорного экрана | android.hardware.faketouch |
| Телефонная связь | android.hardware.telephony |
| Камера | android.hardware.camera |
| Связь малого радиуса действия (NFC) | android.hardware.nfc |
| GPS | android.hardware.location.gps |
| Микрофон | android.hardware.microphone |
| Датчики | android.hardware.sensor |
| Экран в вертикальной ориентации | android.hardware.screen.portrait |
Примечание. Некоторые пульты управления телевизором оснащены микрофоном, но это не то же самое, что аппаратная функция микрофона, описанная здесь. Микрофон контроллера полностью поддерживается.
Полный список функций, подфункций и их дескрипторов приведен в справочнике по функциям.
Как указать требования к оборудованию для телевизоров
В манифесте приложения для Android можно указать требования к аппаратному обеспечению, чтобы оно не устанавливалось на устройства, которые не поддерживают эти функции. Если вы адаптируете существующее приложение для использования на телевизоре, внимательно проверьте манифест приложения на наличие объявлений о требованиях к оборудованию, которые могут помешать его установке на телевизор.
Если в вашем приложении используются аппаратные компоненты, например сенсорный экран или камера, которых нет в телевизоре, но оно может работать без них, укажите в манифесте приложения, что эти компоненты не являются обязательными. В приведенном ниже фрагменте кода манифеста показано, как объявить, что приложению не требуются аппаратные функции, недоступные на телевизорах, но оно использует их на других устройствах:
<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"/>
Примечание. Некоторые функции имеют подфункции, например android.hardware.camera.front, как описано в
справочнике по функциям. Отметьте как required="false" все дополнительные функции, которые также используются в вашем приложении.
Все приложения, предназначенные для использования на телевизорах, должны объявлять, что сенсорный экран не требуется, как описано в разделе Начало работы с приложениями для телевизоров. Если ваше приложение обычно использует одну или несколько функций, не поддерживаемых на телевизорах, измените значение атрибута android:required на false для этих функций в манифесте.
Внимание! Если вы укажете, что аппаратная функция обязательна, задав для нее значение true, ваше приложение нельзя будет установить на телевизоры и оно не будет показываться в программе запуска главного экрана Android TV.
Разрешения, подразумевающие использование функций оборудования
Некоторые uses-permission
объявления в манифесте подразумевают наличие аппаратных функций. Это означает, что если в манифесте приложения запрошены определенные разрешения, его нельзя будет установить и использовать на устройствах Android TV. Следующие часто запрашиваемые разрешения подразумевают наличие определенных аппаратных функций:
| Разрешение | Неявная функция оборудования |
|---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera и android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
Некоторые телевизоры можно подключить только через Ethernet. |
Полный список запросов разрешений, которые подразумевают требование к аппаратным функциям, приведен в руководстве uses-feature. Если ваше приложение запрашивает одну из перечисленных выше функций, добавьте в манифест декларацию uses-feature для подразумеваемой аппаратной функции, указав, что она не является обязательной. android:required="false".
Примечание. Если ваше приложение предназначено для Android 5.0 (уровень API 21) или более поздней версии и использует разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION, пользователи смогут установить его на телевизор, даже если в нем нет сетевой карты или GPS-приемника.
После того как вы сделаете аппаратные функции необязательными для приложения, вам нужно будет проверять их доступность во время выполнения и соответствующим образом корректировать поведение приложения. В следующем разделе рассказывается, как проверить наличие аппаратных функций и как изменить поведение приложения.
Подробнее о фильтрации и декларировании функций в манифесте рассказывается в руководстве по использованию пакета uses-feature.
Как проверить наличие функций оборудования
Платформа Android может сообщить, какие аппаратные функции недоступны на устройстве, на котором запущено ваше приложение. Используйте метод hasSystemFeature(String), чтобы проверить наличие определенных функций во время выполнения. Этот метод принимает один строковый аргумент, который указывает на функцию, которую вы хотите проверить.
В следующем примере кода показано, как определить доступность аппаратных функций во время выполнения:
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."); }
Сенсорный экран
Большинство телевизоров не имеют сенсорных экранов и не поддерживают ввод с помощью указателя, поэтому для навигации используются пульты ДУ с крестовиной. Приложения для телевизоров должны поддерживать управление с помощью пульта с D-pad.
Подробнее о том, как реализовать навигацию с помощью элементов управления, подходящих для телевизоров…
Как заявить о поддержке сенсорного экрана
Некоторые телевизоры поддерживают пульты с указателем и сенсорные экраны. Чтобы улучшить взаимодействие с приложением на устройствах, поддерживающих клики, наведение указателя и прокрутку, вы можете добавить в приложение поддержку этих действий, как на мобильном устройстве.
Если ваше приложение поддерживает сенсорный режим, вы можете заявить об этом, добавив android.software.leanback.supports_touchtrue в файл манифеста AndroidManifest.xml следующий код:
<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>
Примечание. На устройствах, поддерживающих пульт с указателем (например, воздушную мышь или трекпад), при включении этой функции будет использоваться режим курсора и сенсорного управления, а не эмуляция совместимости с платформой. Если не указать эти метаданные, по умолчанию будет использоваться значение false.
Камера
Хотя у телевизора обычно нет камеры, вы можете разместить на нем приложение, связанное с фотографией. Например, если у вас есть приложение, которое позволяет делать, просматривать и редактировать фотографии, вы можете отключить функцию съемки для телевизоров, но оставить возможность просмотра и редактирования. Если вы решили разрешить приложению, связанному с камерой, работать на телевизоре, добавьте в манифест приложения следующее объявление функции:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Если вы разрешите приложению работать без камеры, добавьте в него код, который будет определять, доступна ли камера, и соответствующим образом корректировать работу приложения. В примере ниже показано, как определить наличие камеры:
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
Телевизоры – это стационарные устройства, которые используются в помещении и не имеют встроенных приемников глобальной системы позиционирования (GPS). Если ваше приложение использует данные о местоположении, вы можете разрешить пользователям искать местоположение или использовать статический поставщик данных, например почтовый индекс, заданный при настройке устройства.
Kotlin
// Request a static location from the location manager. val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val location = locationManager.getLastKnownLocation("static") if (location == null) { Log.e(TAG, "Location is null") return } // 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)?.firstOrNull() ?.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); }
Приостанавливать воспроизведение в режиме энергосбережения
Некоторые телевизоры поддерживают режим пониженного энергопотребления, когда пользователь выключает устройство. Вместо того чтобы выключиться, устройство отключает дисплей и продолжает работать в фоновом режиме. В этом режиме по-прежнему можно выводить звук, поэтому, когда устройство переходит в режим энергосбережения, воспроизведение контента останавливается.
Чтобы избежать воспроизведения в режиме энергосбережения, переопределите
onStop
и остановите любой воспроизводимый в данный момент контент:
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(); }
Когда пользователь снова включает питание, вызывается метод onStart, если ваше приложение является активным приложением переднего плана. Дополнительную информацию о запуске и остановке объекта activity можно найти в разделе
Жизненный цикл объекта activity.