Hỗ trợ ghi nội dung

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:

  1. Trong phương thức onCreate() của dịch vụ đầu vào TV, hãy tạo một đối tượng TvInputInfo mới bằng cách sử dụng lớp TvInputInfo.Builder.
  2. Khi tạo đối tượng TvInputInfo mới, hãy gọi setCanRecord(true) trước khi gọi build() để cho biết rằng dịch vụ của bạn có hỗ trợ tính năng ghi.
  3. Đăng ký đối tượng TvInputInfo với hệ thống bằng cách gọi TvInputManager.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.