Hỗ trợ ghi nội dung

Các dịch vụ đầu vào của TV cho phép người dùng tạm dừng và tiếp tục phát kênh bằng API ghi hình tạm thời. Android 7.0 mở rộng tính năng ghi hình tạm dừng bằng cách cho phép người dùng lưu nhiều phiên ghi hình.

Người dùng có thể lên lịch ghi hình trước hoặc bắt đầu ghi hình trong khi xem một chương trình. Sau khi hệ thống lưu 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 truyền hình của hệ thống.

Nếu muốn cung cấp chức năng ghi hình 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 hỗ trợ ghi hình, triển khai khả năng ghi hình các chương trình, xử lý và thông báo mọi lỗi xảy ra trong quá trình ghi hình, đồng thời quản lý các phiên ghi hình.

Cho biết có hỗ trợ tính năng ghi hình hay không

Để cho hệ thống biết rằng dịch vụ đầu vào TV của bạn hỗ trợ ghi hình, hãy đặt thuộc tính android:canRecord trong tệp XML siêu dữ liệu 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ể cho biết tính năng hỗ trợ ghi hình trong mã của mình 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 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 dịch vụ của bạn hỗ trợ ghi âm.
  3. Đăng ký đối tượng TvInputInfo với hệ thống bằng cách gọi TvInputManager.updateTvInputInfo.

Ghi lại một phiên

Sau khi dịch vụ đầu vào TV của bạn đăng ký rằng dịch vụ đó hỗ trợ chức năng ghi hình, hệ thống sẽ gọi phương thức TvInputService.onCreateRecordingSession của bạn khi cần truy cập vào chế độ triển khai tính năng ghi hình 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 dữ liệu kênh chính xác, ghi lại dữ liệu được yêu cầu và truyền đạt trạng thái ghi cũng như lỗi cho hệ thống.

Khi hệ thống gọi RecordingSession.onTune, truyền vào một URI kênh, hãy dò 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 sang kênh đã chọn bằng cách gọi notifyTuned hoặc nếu ứng dụng của bạn không thể chuyển sang kênh thích hợp, hãy gọi notifyError.

Sau đó, 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 hình 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 ghi xong, 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 sẽ gọi RecordingSession.onStopRecording. Lúc này, ứng dụng của bạn phải dừng ghi hình 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 đã ghi 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 được ghi lại.

Xử lý lỗi ghi

Nếu xảy ra lỗi trong quá trình ghi, dẫn đến dữ liệu đã ghi không 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 một bản ghi một phần cho người dùng để phát, hãy gọi notifyRecordingStopped để cho phép hệ thống sử dụng phiên một phần.

Quản lý các phiên được ghi lại

Hệ thống duy trì thông tin cho tất cả các phiên đã ghi từ tất cả các ứ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 thông qua URI ghi nội dung RecordedPrograms. Sử dụng API nhà cung cấp nội dung để đọc, thêm và xoá các mục trong 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 Thông tin cơ bản về trình cung cấp nội dung.

Các phương pháp hay nhất

Các thiết bị TV có thể có bộ nhớ hạn chế, vì vậy, hãy suy xét thật kỹ lưỡng khi phân bổ bộ nhớ để lưu các phiên đã ghi. Sử dụng RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) khi không đủ bộ nhớ để 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. Để tạo điều kiện thuận lợi cho việc này, hãy hoàn tất mọi tác vụ tốn thời gian ban đầu, 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. Khi đó, bạn có thể bắt đầu ghi hình ngay khi lệnh gọi lại onStartRecording kích hoạt.