รองรับการบันทึกเนื้อหา

บริการอินพุตทีวีช่วยให้ผู้ใช้หยุดเล่นช่องชั่วคราวและเล่นต่อได้โดยใช้ API ที่เปลี่ยนเวลา Android 7.0 พัฒนาขึ้นจากการบันทึกรายการเอาไว้รับชมในภายหลัง โดยการให้ผู้ใช้บันทึกเซสชันที่บันทึกไว้หลายรายการ

ผู้ใช้สามารถกำหนดเวลาบันทึกล่วงหน้าหรือเริ่มการบันทึกขณะรับชมได้ โปรแกรม เมื่อระบบบันทึกการอัดเสียงแล้ว ผู้ใช้สามารถเรียกดู จัดการ และเล่นการบันทึกโดยใช้แอป System TV

หากคุณต้องการมอบฟังก์ชันการบันทึกสำหรับบริการอินพุตทีวี คุณต้องระบุให้ระบบทราบว่าแอปของคุณรองรับการบันทึก ใช้ ความสามารถในการบันทึกรายการ จัดการและสื่อสารข้อผิดพลาดที่เกิดขึ้น ในระหว่างการบันทึก และจัดการเซสชันที่บันทึกไว้

ระบุการรองรับการบันทึก

หากต้องการบอกระบบว่าบริการอินพุตทีวีของคุณรองรับการบันทึก ให้ตั้งค่า แอตทริบิวต์ android:canRecord ในไฟล์ XML ข้อมูลเมตาของบริการ ถึง true:

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ข้อมูลเมตาของบริการได้ที่ ประกาศอินพุตทีวีของคุณ ในไฟล์ Manifest

หรือจะระบุการสนับสนุนการบันทึกในโค้ดโดยใช้ ขั้นตอนเหล่านี้:

  1. ในบริการอินพุตทีวี onCreate() ให้สร้างออบเจ็กต์ TvInputInfo ใหม่โดยใช้ TvInputInfo.Builder ชั้นเรียน
  2. เมื่อสร้างออบเจ็กต์ TvInputInfo ใหม่ ให้เรียก setCanRecord(true)ก่อนโทร build() เพื่อระบุว่า บริการรองรับการบันทึก
  3. ลงทะเบียนออบเจ็กต์ TvInputInfo กับระบบโดยการเรียกใช้ TvInputManager.updateTvInputInfo()

บันทึกเซสชัน

หลังจากลงทะเบียนบริการอินพุตทีวีว่ารองรับการบันทึกแล้ว ระบบจะเรียกฟังก์ชัน TvInputService.onCreateRecordingSession() วิธีเมื่อต้องการเข้าถึง การใช้การบันทึกของแอปคุณ ติดตั้งใช้งานด้วยตนเอง ชั้นเรียนย่อย TvInputService.RecordingSession รายการและส่งคืน เมื่อ Callback onCreateRecordingSession() เริ่มทำงาน คลาสย่อยนี้มีหน้าที่ เพื่อเปลี่ยนเป็นข้อมูลช่องที่ถูกต้อง บันทึกข้อมูลที่ขอ รวมทั้งแจ้งสถานะการบันทึกและข้อผิดพลาดไปยังระบบ

เมื่อระบบเรียก RecordingSession.onTune() ส่งผ่าน URI ของช่อง ปรับไปที่ช่อง ที่ URI กำหนด แจ้งระบบว่าแอปของคุณได้ปรับเป็น ช่องทางที่ต้องการด้วยการโทร notifyTuned() หรือหากแอปของคุณไม่สามารถปรับไปยังช่องที่เหมาะสมได้ โปรดโทร notifyError()

ต่อมาระบบจะเรียกใช้ การติดต่อกลับของ RecordingSession.onStartRecording() แอปต้องเริ่มบันทึก ทันที เมื่อระบบเรียกใช้ Callback นี้ ระบบอาจระบุ URI ที่มีข้อมูลเกี่ยวกับโปรแกรมที่กำลังจะบันทึก เมื่อบันทึกเสร็จแล้ว ให้คัดลอกข้อมูลนี้ไปยัง RecordedPrograms ด้วย

สุดท้าย ระบบเรียก RecordingSession.onStopRecording() ณ จุดนี้ แอปของคุณต้องหยุด ทันที นอกจากนี้คุณต้องสร้างรายการใน RecordedPrograms ตารางที่มี URI ข้อมูลเซสชันที่บันทึกไว้ใน RecordedPrograms.COLUMN_RECORDING_DATA_URI และโปรแกรมใดก็ได้ ข้อมูลที่ระบบให้ในการโทรครั้งแรก onStartRecording()

สําหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเข้าถึง ตาราง RecordedPrograms โปรดดูส่วนจัดการเซสชันที่บันทึกไว้

จัดการข้อผิดพลาดในการบันทึก

หากเกิดข้อผิดพลาดระหว่างการบันทึก ซึ่งส่งผลให้ไม่สามารถใช้ข้อมูลที่บันทึกไว้ได้ แจ้งให้ระบบทราบโดยการโทร notifyError() หรือจะโทรหา notifyError()หลังจากสร้างเซสชันการบันทึกเพื่อแจ้งให้ระบบทราบ ที่แอปของคุณไม่สามารถบันทึกเซสชันได้อีกต่อไป

หากเกิดข้อผิดพลาดระหว่างการบันทึก แต่คุณต้องการส่ง การบันทึกบางส่วนให้กับผู้ใช้เพื่อเล่น โทร notifyRecordingStopped() เพื่อให้ระบบดำเนินการ ให้ใช้เซสชันบางส่วน

จัดการเซสชันที่บันทึกไว้

ระบบจะเก็บรักษาข้อมูลของเซสชันที่บันทึกไว้ทั้งหมดจาก แอปช่องที่ สามารถบันทึกใน RecordedPrograms Content Provider ข้อมูลนี้เข้าถึงได้ผ่านทาง RecordedPrograms URI การบันทึกเนื้อหา ใช้ API ผู้ให้บริการเนื้อหาเพื่อ อ่าน เพิ่ม และลบรายการจากตารางนี้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับข้อมูลผู้ให้บริการเนื้อหา โปรดดู ข้อมูลเบื้องต้นเกี่ยวกับผู้ให้บริการเนื้อหา

แนวทางปฏิบัติแนะนำ

อุปกรณ์ทีวีอาจมีพื้นที่เก็บข้อมูลจำกัด ดังนั้นโปรดใช้วิจารณญาณเมื่อ กำลังจัดสรรพื้นที่เก็บข้อมูลเพื่อบันทึกเซสชันที่บันทึกไว้ ใช้ RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) เมื่อ มีพื้นที่ว่างไม่เพียงพอที่จะบันทึกเซสชันที่บันทึกไว้

เมื่อผู้ใช้เริ่มการบันทึก ให้เริ่มบันทึกข้อมูลทันที ให้มากที่สุด เพื่ออำนวยความสะดวกในเรื่องนี้ ให้ดำเนินงานที่ต้องใช้เวลาล่วงหน้าให้เสร็จ เช่น การเข้าถึงและจัดสรรพื้นที่เก็บข้อมูล เมื่อระบบเรียก การติดต่อกลับของ onCreateRecordingSession() เมื่อทำเช่นนั้น คุณจะสามารถเริ่ม ทันทีเมื่อ Callback onStartRecording() เริ่มทำงาน