Obsługa nagrywania treści

Telewizyjne usługi wejściowe umożliwiają użytkownikowi wstrzymywanie i wznawianie odtwarzania kanału za pomocą interfejsów API z przesuwaniem w czasie. Android 7.0 rozszerza możliwości przesuwania w czasie, pozwalając użytkownikowi zapisać wiele nagranych sesji.

Użytkownicy mogą planować nagrywanie z wyprzedzeniem lub rozpoczynać nagrywanie w trakcie oglądania programu. Po zapisaniu nagrania przez system użytkownik może je przeglądać i odtwarzać w systemowej aplikacji TV oraz nim zarządzać.

Jeśli chcesz udostępnić funkcję nagrywania w usłudze wejścia TV, musisz wskazać systemowi, że Twoja aplikacja obsługuje nagrywanie, zaimplementować możliwość nagrywania programów, obsługi i przekazywania wszelkich błędów występujących podczas nagrywania oraz zarządzania nagranymi sesjami.

Wskaż obsługę nagrywania

Aby poinformować system, że usługa wejścia TV obsługuje nagrywanie, ustaw atrybut android:canRecord w pliku XML metadanych usługi na true:

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

Więcej informacji o pliku metadanych usługi znajdziesz w artykule Deklarowanie usługi wejściowej TV w pliku manifestu.

Możesz też wskazać w kodzie obsługę nagrywania, wykonując te czynności:

  1. W metodzie onCreate() usługi wejściowej TV utwórz nowy obiekt TvInputInfo za pomocą klasy TvInputInfo.Builder.
  2. Podczas tworzenia nowego obiektu TvInputInfo wywołaj setCanRecord(true) przed wywołaniem build(), aby wskazać, że Twoja usługa obsługuje nagrywanie.
  3. Zarejestruj w systemie obiekt TvInputInfo, wywołując metodę TvInputManager.updateTvInputInfo().

Nagraj sesję

Gdy usługa wejścia TV zarejestruje, że obsługuje funkcję nagrywania, system wywoła metodę TvInputService.onCreateRecordingSession(), gdy będzie potrzebować dostępu do implementacji nagrywania w aplikacji. Zaimplementuj własną podklasę TvInputService.RecordingSession i zwracaj ją po uruchomieniu wywołania zwrotnego onCreateRecordingSession(). Ta podklasa odpowiada za przełączanie się na prawidłowe dane kanału, rejestrowanie żądanych danych oraz za przekazywanie do systemu informacji o stanie nagrywania i błędach.

Gdy system wywoła RecordingSession.onTune(), przekazując identyfikator URI kanału, dostrój kanał określony w tym identyfikatorze. Powiadom system, że aplikacja dostroiła wybrany kanał, wywołując notifyTuned(). Jeśli aplikacja nie może dostroić się do odpowiedniego kanału, wywołaj notifyError().

System wywoła następnie wywołanie zwrotne RecordingSession.onStartRecording(). Aplikacja musi od razu rozpocząć nagrywanie. Gdy system wywoła to wywołanie zwrotne, może podać identyfikator URI zawierający informacje o programie, który ma zostać zarejestrowany. Po zakończeniu rejestrowania skopiuj te dane do tabeli danych RecordedPrograms.

Na koniec system wywołuje funkcję RecordingSession.onStopRecording(). Aplikacja musi wtedy natychmiast zatrzymać nagrywanie. Musisz też utworzyć w tabeli RecordedPrograms wpis zawierający zarejestrowany identyfikator URI danych sesji z kolumny RecordedPrograms.COLUMN_RECORDING_DATA_URI oraz wszelkie informacje o programie dostarczone przez system w pierwszym wywołaniu metody onStartRecording().

Więcej informacji o uzyskiwaniu dostępu do tabeli RecordedPrograms znajdziesz w sekcji Zarządzanie zarejestrowanymi sesjami.

Postępowanie w przypadku błędów nagrywania

Jeśli podczas nagrywania wystąpi błąd, który spowoduje, że zarejestrowane dane będą bezużyteczne, powiadom system, wywołując metodę notifyError(). Po utworzeniu sesji nagrywania możesz też zadzwonić pod numer notifyError(), aby poinformować system, że aplikacja nie może już nagrywać sesji.

Jeśli podczas nagrywania wystąpi błąd, ale chcesz udostępnić użytkownikom częściowe nagranie do odtworzenia, wywołaj notifyRecordingStopped(), aby umożliwić systemowi wykorzystanie częściowej sesji.

Zarządzaj nagranymi sesjami

System przechowuje informacje o wszystkich zarejestrowanych sesjach ze wszystkich aplikacji kanału, które umożliwiają nagrywanie, w tabeli dostawców treści RecordedPrograms. Te informacje są dostępne za pomocą identyfikatorów URI rejestrowania treści RecordedPrograms. Do odczytywania, dodawania i usuwania wpisów z tej tabeli służą interfejsy API dostawców treści.

Więcej informacji o pracy z danymi dostawców treści znajdziesz w artykule z podstawowymi informacjami o dostawcach treści.

Sprawdzone metody

Telewizory mogą mieć ograniczoną pamięć, więc przy przydzielaniu pamięci do nagrywania należy rozstrzygnąć, ile pamięci ma być nagrywane. Użyj RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE), gdy nie ma wystarczającej ilości miejsca do zapisania zarejestrowanej sesji.

Gdy użytkownik rozpocznie nagrywanie, jak najszybciej zacznij rejestrować dane. Aby to ułatwić, wykonaj wszystkie czasochłonne zadania z góry, takie jak uzyskiwanie dostępu do miejsca na dane i jego przydzielanie, gdy system wywoła wywołanie zwrotne onCreateRecordingSession(). Pozwoli Ci to rozpocząć nagrywanie od razu po uruchomieniu wywołania zwrotnego onStartRecording().