Работа с телевизионным оборудованием

Аппаратное обеспечение телевизоров существенно отличается от других устройств Android. Телевизоры не включают в себя некоторые аппаратные функции, имеющиеся в других устройствах Android, такие как сенсорные экраны, камеры и GPS-приемники. Телевизоры также полностью зависят от дополнительных аппаратных устройств: для взаимодействия с приложениями на телевизоре пользователям необходимо использовать пульт дистанционного управления или геймпад. (Чтобы узнать о различных способах ввода, см. раздел «Управление контроллерами телевизора ».)

При разработке приложения для телевизора тщательно учитывайте аппаратные ограничения и требования, предъявляемые к работе на телевизионном оборудовании. Проверьте, работает ли ваше приложение на телевизоре, и учтите возможности, которые могут быть недоступны на других устройствах.

Проверьте наличие телевизионного устройства.

Если вы разрабатываете приложение, работающее как на телевизорах, так и на других устройствах, вам может потребоваться проверить, на каком типе устройства работает ваше приложение, и скорректировать его работу. Например, если ваше приложение запускается через Intent , проверьте свойства устройства, чтобы определить, следует ли запускать активность, ориентированную на телевизор, или активность для телефона.

Рекомендуемый способ определить, работает ли ваше приложение на телевизоре, — использовать метод PackageManager.hasSystemFeature() для проверки режима работы устройства (телевизор). Следующий пример кода показывает, как проверить, работает ли ваше приложение на телевизоре:

Котлин

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 подразумевают наличие аппаратных функций . Такое поведение означает, что запрос некоторых разрешений в манифесте вашего приложения может исключить возможность установки и использования вашего приложения на телевизионных устройствах. Следующие часто запрашиваемые разрешения создают неявное требование наличия аппаратных функций:

Разрешение Предполагаемая аппаратная функция
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera и
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (только для целевого уровня API 20 или ниже)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (только для целевого уровня API 20 или ниже)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Некоторые телевизоры имеют только проводное подключение (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) для проверки наличия определенных функций во время выполнения. Этот метод принимает один строковый аргумент, указывающий на функцию, которую вы хотите проверить.

Приведенный ниже пример кода демонстрирует, как определить доступность аппаратных функций во время выполнения:

Котлин

// 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). Приложения для телевизоров всегда должны поддерживать пульт дистанционного управления с крестовиной.

Для получения дополнительной информации о корректной поддержке навигации с использованием элементов управления, удобных для телевизора, см. раздел «Навигация на телевизоре» .

Объявить поддержку сенсорного экрана

Некоторые телевизоры поддерживают пульты дистанционного управления с указателем и сенсорные дисплеи. Ваше приложение может поддерживать взаимодействие по щелчку, наведению курсора и прокрутке, как на мобильных устройствах, чтобы обеспечить более удобное использование на устройствах, которые их поддерживают.

Если ваше приложение поддерживает сенсорный режим, вы можете объявить о поддержке сенсорного управления, добавив в файл AndroidManifest.xml параметр android.software.leanback.supports_touch со значением true :

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

Примечание: На устройствах, поддерживающих указательный пульт (например, аэромышь или трекпад), включение этой функции активирует режим курсора и сенсорного управления, а не полагается на эмуляцию совместимости платформы. Если эта метаданные отсутствуют, значение по умолчанию будет false .

Камера

Хотя телевизоры обычно не имеют встроенной камеры, вы все равно можете установить на них приложение, связанное с фотографией. Например, если у вас есть приложение, которое делает, просматривает и редактирует фотографии, вы можете отключить функцию фотосъемки для телевизоров и при этом позволить пользователям просматривать и даже редактировать фотографии. Если вы решите разрешить работу вашего приложения, связанного с камерой, на телевизоре, добавьте в манифест приложения следующее объявление функции:

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

Если вы разрешаете своему приложению работать без камеры, добавьте в него код, который определяет, доступна ли функция камеры, и вносит корректировки в работу приложения. Следующий пример кода демонстрирует, как определить наличие камеры:

Котлин

// 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). Если ваше приложение использует информацию о местоположении, вы все равно можете позволить пользователям искать местоположение или использовать статический поставщик местоположения, например, почтовый индекс, настроенный во время настройки телевизора.

Котлин

// 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);
}

Приостановка воспроизведения в режиме энергосбережения

Некоторые телевизоры поддерживают режим пониженного энергопотребления, который активируется при выключении устройства. Вместо выключения устройство отключает дисплей и продолжает работу Android TV в фоновом режиме. В этом режиме вывод звука остается включенным, поэтому остановите воспроизведение любого контента, когда устройство находится в режиме пониженного энергопотребления.

Чтобы избежать воспроизведения в режиме энергосбережения, переопределите onStop() и остановите воспроизведение любого контента, который в данный момент воспроизводится:

Котлин

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() если ваше приложение является активным приложением на переднем плане. Дополнительную информацию о запуске и остановке активности см. в разделе «Жизненный цикл активности» .