Os serviços de entrada de TV permitem que o usuário pause e retome a reprodução do canal usando APIs de time-shifting. O Android 7.0 expande a mudança de tempo, permitindo que o usuário salve várias sessões gravadas.
Os usuários podem programar gravações com antecedência ou iniciar uma gravação enquanto assistem um programa. Depois que o sistema salva uma gravação, o usuário pode procurar, gerenciar e reproduzir a gravação usando o app de TV do sistema.
Se você quiser oferecer funções de gravação para seu serviço de entrada de TV, indique ao sistema que o app oferece suporte a gravação, implemente a capacidade de gravar programas, resolva e comunique erros que possam ocorrer durante a gravação e gerencie suas sessões gravadas.
Indicar compatibilidade com gravação
Para informar ao sistema que o serviço de entrada de TV oferece suporte a gravação, defina
o atributo android:canRecord
no arquivo XML de metadados do serviço
como true
:
<tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:canRecord="true" android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />
Para saber mais sobre o arquivo de metadados do serviço, consulte Declarar seu serviço de entrada de TV no manifesto.
Como alternativa, você pode indicar suporte a gravação no seu código seguindo estas etapas:
- No método
onCreate()
do serviço de entrada de TV, crie um novo objetoTvInputInfo
usando a classeTvInputInfo.Builder
. - Ao criar o novo objeto
TvInputInfo
, chamesetCanRecord(true)
antes de chamarbuild()
para indicar que seu serviço oferece suporte à gravação. - Registre seu objeto
TvInputInfo
no sistema chamandoTvInputManager.updateTvInputInfo()
.
Gravar uma sessão
Depois que o serviço de entrada de TV registrar que oferece suporte ao recurso
de gravação, o sistema chamará o método
TvInputService.onCreateRecordingSession()
quando precisar acessar
a implementação de gravação do app. Implemente sua própria
subclasse TvInputService.RecordingSession
e retorne-a
quando o callback onCreateRecordingSession()
for acionado. Essa subclasse é responsável
por alternar para os dados de canal corretos, gravando os dados solicitados
e comunicando o status de gravação e os erros ao sistema.
Quando o sistema chamar
RecordingSession.onTune()
, transmitindo um URI de canal, acesse o canal
especificado pelo URI. Notifique o sistema de que seu app sintonizou o
canal desejado chamando
notifyTuned()
ou, se o app não conseguir sintonizar o canal adequado, chame
notifyError()
.
Em seguida, o sistema invocará o
callback RecordingSession.onStartRecording()
. O app precisa começar a gravar
imediatamente. Quando o sistema invoca esse callback, ele pode fornecer um URI
que contenha informações sobre o programa que está prestes a ser gravado.
Quando a gravação for concluída, copie esses dados para a tabela de dados RecordedPrograms
.
Por fim, o sistema chama
RecordingSession.onStopRecording()
. Nesse momento, o app precisa interromper
a gravação imediatamente. Você também precisa criar uma entrada na tabela
RecordedPrograms
que inclua o URI dos dados da sessão gravada na coluna
RecordedPrograms.COLUMN_RECORDING_DATA_URI
e todas as informações
do programa que o sistema forneceu na chamada inicial para
onStartRecording()
.
Para mais detalhes sobre como acessar a tabela RecordedPrograms
, consulte a seção Gerenciar sessões gravadas.
Solucionar erros de gravação
Se um erro ocorrer durante a gravação, e os dados gravados forem inutilizáveis,
notifique o sistema chamando
notifyError()
.
Você também pode chamar
notifyError()
depois que uma sessão de gravação for criada para informar ao sistema
que seu app não pode mais gravar sessões.
Se um erro ocorrer durante a gravação, mas você quiser fornecer uma
gravação parcial aos usuários para reprodução, chame
notifyRecordingStopped()
para permitir que o sistema
use a sessão parcial.
Gerenciar sessões gravadas
O sistema mantém as informações de todas as sessões gravadas de todos
os apps de canal com recursos de gravação na
tabela de provedor de conteúdo
RecordedPrograms
. Essas informações podem ser acessadas pelos
URIs de gravação de conteúdo
RecordedPrograms
. Use APIs de provedores de conteúdo para
ler, adicionar e excluir entradas dessa tabela.
Para saber mais sobre como trabalhar com dados de provedores de conteúdo, consulte Fundamentos do provedor de conteúdo.
Práticas recomendadas
Dispositivos de TV podem ter armazenamento limitado. Portanto, tenha bom senso ao alocar armazenamento para salvar as sessões gravadas. Use
RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
quando
não houver espaço suficiente para salvar uma sessão gravada.
Quando o usuário iniciar a gravação, comece a gravar os dados o mais
rápido possível. Para facilitar esse processo, realize todas as tarefas iniciais demoradas,
como acessar e alocar espaço de armazenamento, quando o sistema invocar o
callback onCreateRecordingSession()
. Isso permite que você comece
a gravar imediatamente quando o
callback onStartRecording()
for disparado.