Dịch vụ đầu vào TV cho phép người dùng tạm dừng và tiếp tục phát kênh bằng API dịch chuyển thời gian. Android 7.0 mở rộng khả năng chuyển dịch thời gian bằng cách cho phép người dùng lưu nhiều phiên đã ghi lại.
Người dùng có thể lên lịch ghi trước hoặc bắt đầu ghi khi đang xem một chương trình. Sau khi hệ thống lưu một bản ghi, người dùng có thể duyệt xem, quản lý và phát lại bản ghi đó bằng ứng dụng TV hệ thống.
Nếu muốn cung cấp chức năng ghi cho dịch vụ đầu vào TV, bạn phải cho hệ thống biết rằng ứng dụng của bạn có hỗ trợ tính năng ghi, triển khai tính năng ghi lại chương trình, xử lý và truyền đạt mọi lỗi xảy ra trong quá trình ghi, cũng như quản lý các phiên đã ghi.
Cho biết chế độ hỗ trợ ghi lại
Để thông báo cho hệ thống biết rằng dịch vụ đầu vào TV có hỗ trợ tính năng ghi, hãy đặt thuộc tính android:canRecord
trong tệp XML siêu dữ liệu của dịch vụ thành true
:
<tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:canRecord="true" android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />
Để biết thêm thông tin về tệp siêu dữ liệu dịch vụ, hãy xem phần Khai báo dịch vụ đầu vào TV trong tệp kê khai.
Ngoài ra, bạn có thể chỉ báo khả năng hỗ trợ ghi trong mã bằng cách làm theo các bước sau:
- Trong phương thức
onCreate()
của dịch vụ đầu vào TV, hãy tạo một đối tượngTvInputInfo
mới bằng cách sử dụng lớpTvInputInfo.Builder
. - Khi tạo đối tượng
TvInputInfo
mới, hãy gọisetCanRecord(true)
trước khi gọibuild()
để cho biết rằng dịch vụ của bạn có hỗ trợ tính năng ghi. - Đăng ký đối tượng
TvInputInfo
với hệ thống bằng cách gọiTvInputManager.updateTvInputInfo()
.
Ghi lại phiên
Sau khi dịch vụ đầu vào TV của bạn đăng ký rằng dịch vụ này hỗ trợ chức năng ghi, hệ thống sẽ gọi phương thức TvInputService.onCreateRecordingSession()
khi cần truy cập vào quá trình triển khai tính năng ghi của ứng dụng. Triển khai lớp con TvInputService.RecordingSession
của riêng bạn và trả về lớp con đó khi lệnh gọi lại onCreateRecordingSession()
kích hoạt. Lớp con này chịu trách nhiệm chuyển sang đúng dữ liệu kênh, ghi lại dữ liệu được yêu cầu, đồng thời thông báo trạng thái ghi và lỗi cho hệ thống.
Khi hệ thống gọi RecordingSession.onTune()
, truyền URI kênh, hãy tinh chỉnh kênh mà URI chỉ định. Thông báo cho hệ thống rằng ứng dụng của bạn đã chuyển đến kênh mong muốn bằng cách gọi notifyTuned()
hoặc nếu ứng dụng của bạn không thể chuyển đến kênh thích hợp, hãy gọi notifyError()
.
Tiếp theo, hệ thống sẽ gọi lệnh gọi lại RecordingSession.onStartRecording()
. Ứng dụng của bạn phải bắt đầu ghi ngay lập tức. Khi gọi lệnh gọi lại này, hệ thống có thể cung cấp một URI chứa thông tin về chương trình sắp được ghi lại.
Khi quá trình ghi hoàn tất, hãy sao chép dữ liệu này vào bảng dữ liệu RecordedPrograms
.
Cuối cùng, hệ thống gọi RecordingSession.onStopRecording()
. Tại thời điểm này, ứng dụng của bạn phải dừng ghi ngay lập tức. Bạn cũng cần tạo một mục trong bảng RecordedPrograms
bao gồm URI dữ liệu phiên được ghi lại trong cột RecordedPrograms.COLUMN_RECORDING_DATA_URI
và mọi thông tin chương trình mà hệ thống đã cung cấp trong lệnh gọi ban đầu đến onStartRecording()
.
Để biết thêm thông tin về cách truy cập vào bảng RecordedPrograms
, hãy xem phần Quản lý các phiên đã ghi lại.
Xử lý lỗi ghi
Nếu xảy ra lỗi trong quá trình ghi, dẫn đến việc dữ liệu đã ghi không sử dụng được, hãy thông báo cho hệ thống bằng cách gọi notifyError()
.
Bạn cũng có thể gọi notifyError()
sau khi tạo một phiên ghi để cho hệ thống biết rằng ứng dụng của bạn không thể ghi lại các phiên đó nữa.
Nếu xảy ra lỗi trong quá trình ghi nhưng bạn muốn cung cấp bản ghi một phần cho người dùng để phát lại, hãy gọi notifyRecordingStopped()
để cho phép hệ thống sử dụng phiên từng phần.
Quản lý các phiên đã ghi lại
Hệ thống sẽ duy trì thông tin cho tất cả các phiên được ghi lại từ mọi ứng dụng kênh có khả năng ghi trong bảng nhà cung cấp nội dung RecordedPrograms
. Bạn có thể truy cập thông tin này qua các URI ghi nội dung RecordedPrograms
. Hãy sử dụng API của nhà cung cấp nội dung để đọc, thêm và xoá các mục nhập khỏi bảng này.
Để biết thêm thông tin về cách làm việc với dữ liệu của trình cung cấp nội dung, hãy xem bài viết Kiến thức cơ bản về trình cung cấp nội dung.
Các phương pháp hay nhất
Thiết bị TV có thể có bộ nhớ hạn chế, vì vậy, hãy suy xét thật cẩn thận khi phân bổ bộ nhớ để lưu các phiên đã ghi. Hãy sử dụng
RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)
khi
không có đủ dung lượng để lưu một phiên đã ghi.
Khi người dùng bắt đầu ghi, hãy bắt đầu ghi dữ liệu càng sớm càng tốt. Để hỗ trợ việc này, hãy hoàn tất mọi thao tác cần nhiều thời gian trước, chẳng hạn như truy cập và phân bổ không gian lưu trữ, khi hệ thống gọi lệnh gọi lại onCreateRecordingSession()
. Làm như vậy cho phép bạn bắt đầu
ghi lại ngay khi lệnh gọi lại
onStartRecording()
kích hoạt.