Suporte para gravação de conteúdo

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:

  1. No método onCreate() do serviço de entrada de TV, crie um novo objeto TvInputInfo usando a classe TvInputInfo.Builder.
  2. Ao criar o novo objeto TvInputInfo, chame setCanRecord(true) antes de chamar build() para indicar que seu serviço oferece suporte à gravação.
  3. Registre seu objeto TvInputInfo no sistema chamando TvInputManager.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.