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:
- W metodzie
onCreate()
usługi wejściowej TV utwórz nowy obiektTvInputInfo
za pomocą klasyTvInputInfo.Builder
. - Podczas tworzenia nowego obiektu
TvInputInfo
wywołajsetCanRecord(true)
przed wywołaniembuild()
, aby wskazać, że Twoja usługa obsługuje nagrywanie. - 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()
.