Gravação para TV

Serviços de entrada de TV permitem que o usuário pause e retome a reprodução do canal por meio de APIs de time-shifting. O Android N expande o time-shifting ao permitir que o usuário salve várias sessões gravadas.

Os usuários podem programar gravações antecipadamente ou iniciar uma gravação enquanto assistem a um programa. Quando o sistema salvar a gravação, o usuário poderá procurar, gerenciar e reproduzir a gravação usando o aplicativo de TV do sistema.

Se quiser fornecer recursos de gravação para seu serviço de entrada de TV, indique para o sistema que o aplicativo oferece suporte a gravação, implemente a capacidade de gravar programas, solucione e comunique erros ocorridos durante a gravação e gerencie as sessões gravadas.

Observação: O aplicativo Live Channels ainda não oferece aos usuários uma forma de criar ou acessar gravações. Enquanto o aplicativo Live Channels não sofrer alterações, será difícil testar toda a experiência de gravação de seu serviço de entrada de TV.

Indicar suporte para gravação

Para informar ao sistema que seu 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 obter mais informações sobre o arquivo de metadados do serviço, consulte Declarar seu serviço de entrada de TV no manifesto (em inglês).

Como alternativa, você pode indicar suporte a gravação em seu código usando estas etapas:

  1. No método TvInputService.onCreate(), 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 a gravação.
  3. Registre seu objeto TvInputInfo com o 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á seu TvInputService.onCreateRecordingSession() quando precisar acessar a implementação de gravação do seu aplicativo. Implemente sua própria subclasse TvInputService.RecordingSession e retorne-a quando o retorno de chamada 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(), passando um URI de canal, acesse o canal especificado pelo URI. Notifique o sistema de que seu aplicativo acessou o canal desejado ao chamar notifyTuned() ou, se o aplicativo não conseguiu acessar o canal correto, chame notifyError().

Em seguida, o sistema invoca o retorno de chamada RecordingSession.onStartRecording() . O aplicativo deve iniciar a gravação imediatamente. Quando o sistema invoca esse retorno de chamada, ele pode fornecer um URI que contenha informações sobre o programa que será gravado. Quando a gravação for concluída, você deverá copiar esses dados para a tabela de dados RecordedPrograms.

Por fim, o sistema chama RecordingSession.onStopRecording(). Nesse momento, o aplicativo deve interromper a gravação imediatamente. Também é preciso criar uma entrada na tabela RecordedPrograms. Essa entrada deve incluir o URI dos dados da sessão gravada na coluna RecordedPrograms.COLUMN_RECORDING_DATA_URI e qualquer informação sobre o programa fornecida pelo sistema na chamada inicial em onStartRecording().

Para saber mais sobre como acessar a tabela RecordedPrograms, consulte Gerenciar sessões gravadas.

Solucionar erros de gravação

Se um erro ocorrer durante a gravação, inutilizando os dados gravados, notifique o sistema chamando RecordingSession.notifyError(). Também é possível chamar notifyError() depois que uma sessão de gravação é criada para informar ao sistema que seu aplicativo não pode mais gravar sessões.

Se um erro ocorrer durante a gravação, mas você quiser fornecer uma gravação parcial que pode ser usada pelos usuários para reprodução, chame RecordingSession.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 aplicativos de canais com recursos de gravação na tabela de provedor de conteúdo TvContract.RecordedPrograms . Essas informações podem ser acessadas pelo URI de conteúdo RecordedPrograms.Uri. 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, então tenha bom senso ao alocar armazenamento para salvar 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 assim que possível. Para facilitar esse processo, realize qualquer tarefa demorada imediatamente, como acessar e alocar o espaço de armazenamento, quando o sistema invocar o retorno de chamada onCreateRecordingSession(). Isso permite que você comece a gravar imediatamente após o acionamento do retorno de chamada onStartRecording() .