Запись ТВ

Службы телевидения позволяют пользователю ставить воспроизведение телеканалов на паузу и возобновлять его, используя для этого API-интерфейсы с временным сдвигом. Android N расширяет возможности временного сдвига, позволяя пользователю сохранять несколько записанных сеансов.

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

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

Указание на поддержку записи

Чтобы сообщить системе, что ваша служба ТВ поддерживает запись, выполните следующие шаги:

  1. В методе TvInputService.onCreate() создайте новый объект TvInputInfo, используя класс TvInputInfo.Builder.
  2. При создании нового объекта TvInputInfo вызовите метод setCanRecord(true) до вызова build(), чтобы указать на то, что служба поддерживает запись.
  3. Зарегистрируйте объект TvInputInfo в системе посредством вызова метода TvInputService.updateTvInputInfo().

Запись сеанса

Когда служба ТВ зарегистрирует поддержку записи, система будет вызывать ваш метод TvInputService.onCreateRecordingSession(), когда ей потребуется доступ к функции записи в вашем приложении. Реализуйте собственный подкласс TvInputService.RecordingSession и возвращайте его при получении обратного вызова onCreateRecordingSession(). Этот подкласс отвечает за переключение на данные нужного канала, запись запрошенных данных, а также передачу системе информации о состоянии записи и ошибках.

Когда система будет вызывать метод RecordingSession.onTune(), передавая в него URI канала, приложение должно переключаться на канал, указанный URI. Сообщите системе о том, что приложение настроилось на желаемый канал, вызвав метод notifyTuned(). Если приложению не удалось настроиться на желаемый канал, оно должно вызвать метод notifyError().

Затем система передает обратный вызов RecordingSession.onStartRecording(). После этого приложение должно сразу же начать запись. Когда система передает этот обратный вызов, она может указать URI с информацией о программе для записи. После завершения записи эти данные нужно скопировать в таблицу данных RecordedPrograms.

Наконец, система вызывает метод RecordingSession.onStopRecording(). В этот момент приложение должно сразу же прекратить запись. Также вам нужно будет создать запись в таблице RecordedPrograms. Эта запись должна содержать URI записанных данных в столбце RecordedPrograms.COLUMN_RECORDING_DATA_URI, а также любую информацию о программе, которая была предоставлена системой в исходном вызове onStartRecording().

Более подробную информацию о доступе к таблице RecordedPrograms можно найти в разделе Управление записанными сеансами.

Обработка ошибок записи

Если во время записи возникла ошибка, в результате которой записанные данные стали непригодными для использования, то об этом нужно сообщить системе, вызвав метод RecordingSession.notifyError(). Аналогичным образом, вы можете вызвать метод notifyError() после создания сеанса записи, чтобы сообщить системе, что приложение больше не может записывать сеансы.

Если в процессе записи возникла ошибка, но вы хотите предоставить пользователям приемлемую часть записи для воспроизведения, вызовите RecordingSession.notifyRecordingStopped(), чтобы дать системе возможность использовать частичный сеанс.

Управление записанными сеансами

Система хранит информацию обо всех записанных сеансах всех приложений, поддерживающих запись каналов, в таблице поставщиков контента TvContract.RecordedPrograms. Эта информация доступна через URI контента RecordedPrograms.Uri. Используйте API-интерфейсы поставщиков контента для чтения, добавления и удаления записей из этой таблицы.

Дополнительную информацию о работе с данными поставщиков контента можно найти в разделе Основные сведения о поставщике контента.

Советы и рекомендации

Объем хранилищ на телевизионных устройствах может быть ограничен, поэтому следует разумно распределять доступные хранилища для хранения записанных сеансов. Используйте RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE), когда для сохранения записанного сеанса недостаточно места.

Когда пользователь инициирует запись, приложение должно как можно скорее начать записывать данные. Для этого рекомендуется заранее выполнить все продолжительные задачи, такие как получение доступа к хранилищу и распределение свободного места, когда система передает обратный вызов onCreateRecordingSession(). Это позволяет сразу же начать запись после получения обратного вызова onStartRecording().