Поддержка записи контента

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

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

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

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

Чтобы сообщить системе, что ваша служба ввода ТВ поддерживает запись, установите для атрибута android:canRecord в XML-файле метаданных вашей службы значение true :

<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
  android:canRecord="true"
  android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />

Дополнительные сведения о файле метаданных службы см . в разделе «Объявление службы ввода ТВ в манифесте» .

Альтернативно вы можете указать поддержку записи в своем коде, выполнив следующие действия:

  1. В методе onCreate() службы телевизионного ввода создайте новый объект TvInputInfo , используя класс TvInputInfo.Builder .
  2. При создании нового объекта TvInputInfo вызовите setCanRecord(true) перед вызовом build() чтобы указать, что ваша служба поддерживает запись.
  3. Зарегистрируйте свой объект TvInputInfo в системе, вызвав TvInputManager.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 см. в разделе «Управление записанными сеансами» .

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

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

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

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

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

Дополнительные сведения о работе с данными поставщика контента см. в разделе Основы поставщика контента .

Лучшие практики

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

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