הקלטת תוכן לתמיכה

שירותי קלט לטלוויזיה מאפשרים למשתמש להשהות את ההפעלה של הערוץ ולחדש אותה באמצעות ממשקי API של הזזת זמן. ב-Android 7.0, אפשרות ההזזה בזמן הורחבה כך שהמשתמש יכול לשמור כמה סשנים מוקלטים.

המשתמשים יכולים לתזמן הקלטות מראש או להתחיל הקלטה בזמן הצפייה בתוכנית. אחרי שהמערכת שומרת הקלטה, המשתמש יכול לעיין בהקלטה, לנהל אותה ולהפעיל אותה מחדש באמצעות אפליקציית הטלוויזיה של המערכת.

אם רוצים לספק פונקציונליות של הקלטה לשירות קלט הטלוויזיה, צריך לציין למערכת שהאפליקציה תומכת בהקלטה, להטמיע את האפשרות להקליט תוכניות, לטפל בשגיאות שמתרחשות במהלך ההקלטה ולדווח עליהן, ולנהל את ההפעלות המוקלטות.

אינדיקציה לתמיכה בהקלטה

כדי לציין למערכת ששירות קלט הטלוויזיה שלכם תומך בהקלטה, צריך להגדיר את המאפיין android:canRecord בקובץ ה-XML של המטא-נתונים של השירות לערך true:

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

מידע נוסף על קובץ המטא-נתונים של השירות זמין במאמר בנושא הצהרה על שירות קלט לטלוויזיה בקובץ המניפסט.

אפשר גם לציין בקוד שיש תמיכה בהקלטה באמצעות השלבים הבאים:

  1. בשיטה onCreate של שירות קלט הטלוויזיה, יוצרים אובייקט TvInputInfo חדש באמצעות המחלקה TvInputInfo.Builder.
  2. כשיוצרים את אובייקט TvInputInfo החדש, קוראים ל-setCanRecord(true) לפני שקוראים ל-build כדי לציין שהשירות תומך בהקלטה.
  3. רושמים את אובייקט TvInputInfo במערכת על ידי קריאה ל-TvInputManager.updateTvInputInfo.

הקלטת מפגש

אחרי ששירות קלט הטלוויזיה נרשם כתומך בפונקציונליות של הקלטה, המערכת קוראת לשיטה TvInputService.onCreateRecordingSession כשצריך לגשת להטמעה של ההקלטה באפליקציה. מטמיעים מחלקת משנה (subclass) משלכם TvInputService.RecordingSession ומחזירים אותה onCreateRecordingSession כשהקריאה החוזרת (callback) מופעלת. המחלקת המשנית הזו אחראית למעבר לנתוני הערוץ הנכונים, לתיעוד הנתונים המבוקשים ולדיווח על סטטוס ההקלטה ושגיאות למערכת.

כשהמערכת קוראת ל-RecordingSession.onTune, ומעבירה URI של ערוץ, המערכת עוברת לערוץ שצוין ב-URI. צריך להודיע למערכת שהאפליקציה עברה לערוץ שנבחר באמצעות קריאה ל-notifyTuned, או אם האפליקציה לא יכולה לעבור לערוץ המתאים, קריאה ל-notifyError.

לאחר מכן המערכת מפעילה את הקריאה החוזרת RecordingSession.onStartRecording. האפליקציה צריכה להתחיל להקליט באופן מיידי. כשהמערכת מפעילה את הקריאה החוזרת הזו, היא עשויה לספק URI שמכיל מידע על התוכנית שעומדת להיות מוקלטת. בסיום ההקלטה, מעתיקים את הנתונים האלה לטבלת הנתונים RecordedPrograms.

לבסוף, המערכת קוראת ל-RecordingSession.onStopRecording. בשלב הזה, האפליקציה צריכה להפסיק את ההקלטה באופן מיידי. צריך גם ליצור רשומה בטבלה RecordedPrograms שכוללת את ה-URI של נתוני הסשן שתועדו בעמודה RecordedPrograms.COLUMN_RECORDING_DATA_URI, וכל מידע על התוכנית שהמערכת סיפקה בקריאה הראשונית אל onStartRecording.

פרטים נוספים על גישה לטבלה RecordedPrograms זמינים בקטע ניהול של סשנים מוקלטים.

טיפול בשגיאות בהקלטה

אם מתרחשת שגיאה במהלך ההקלטה, שגורמת לכך שהנתונים המוקלטים לא ניתנים לשימוש, צריך להודיע על כך למערכת באמצעות קריאה ל-notifyError. אפשר גם להתקשר אל notifyError אחרי שיוצרים סשן הקלטה כדי להודיע למערכת שהאפליקציה לא יכולה יותר להקליט סשנים.

אם מתרחשת שגיאה במהלך ההקלטה אבל רוצים לספק למשתמשים הקלטה חלקית להפעלה, צריך להתקשר אל notifyRecordingStopped כדי לאפשר למערכת להשתמש בהקלטה החלקית.

ניהול סשנים מוקלטים

המערכת שומרת מידע על כל הסשנים המוקלטים מכל האפליקציות של ערוצים עם אפשרות הקלטה בטבלה של ספק התוכן RecordedPrograms. המידע הזה נגיש דרך RecordedPrograms כתובות ה-URI של הקלטות התוכן. אפשר להשתמש בממשקי API של ספקי תוכן כדי לקרוא, להוסיף ולמחוק רשומות מהטבלה הזו.

מידע נוסף על עבודה עם נתונים של ספקי תוכן זמין במאמר יסודות בנושא ספקי תוכן.

שיטות מומלצות

יכול להיות שנפח האחסון במכשירי טלוויזיה מוגבל, לכן כדאי להשתמש בשיקול דעת כשמקצים נפח אחסון לשמירת סשנים מוקלטים. משתמשים ב-RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE) כשאין מספיק מקום כדי לשמור את ההקלטה של הפגישה.

כשהמשתמש מתחיל הקלטה, צריך להתחיל להקליט נתונים בהקדם האפשרי. כדי לעשות זאת, צריך להשלים מראש משימות שגוזלות זמן, כמו גישה לנפח אחסון והקצאת נפח אחסון, כשהמערכת מפעילה את הקריאה החוזרת onCreateRecordingSession. כך תוכלו להתחיל להקליט מיד כשמופעל ה-callback‏ onStartRecording.