Compatibilidade com gravação de conteúdo

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 7.0 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 app 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 app é compatível com gravação, implemente a capacidade de gravar programas, solucione e comunique erros ocorridos durante a gravação e gerencie as sessões gravadas.

Indicar compatibilidade com gravação

Para informar ao sistema que seu serviço de entrada de TV é compatível com 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 mais informações sobre o arquivo de metadados do serviço, consulte Declarar seu serviço de entrada de TV no manifesto.

Como alternativa, você pode indicar compatibilidade com gravação em seu código seguindo estas etapas:

  1. No serviço de entrada de TV 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 é compatível com 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 é compatível com o recurso de gravação, o sistema chamará seu método TvInputService.onCreateRecordingSession() quando precisar acessar a implementação de gravação do seu 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(), passando um URI de canal, acesse o canal especificado pelo URI. Notifique o sistema de que seu app acessou o canal desejado chamando notifyTuned() ou, se o app não conseguir acessar o canal correto, chame notifyError().

Em seguida, o sistema invoca o callback RecordingSession.onStartRecording(). O app começará a gravação imediatamente. Quando o sistema invoca esse callback, ele pode fornecer um URI que contenha informações sobre o programa que será gravado. Quando a gravação for concluída, você precisará copiar 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. Também é necessário criar uma entrada na tabela RecordedPrograms. Essa entrada precisa 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 para 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 notifyError(). Também é possível chamar notifyError() depois que uma sessão de gravação é criada para informar o 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 que pode ser usada pelos 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 canais 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, 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 importante, como acessar e alocar o espaço de armazenamento, quando o sistema invocar o callback onCreateRecordingSession(). Isso permite que você comece a gravar imediatamente após o acionamento do callback onStartRecording().