استخدِم واجهات برمجة التطبيقات الخاصة بميزة "التحكّم بالبثّ" في خدمة إدخال التلفزيون للسماح للمستخدمين بإيقاف البرامج المباشرة مؤقتًا وترجيعها وتقديمها سريعًا في قنوات الخدمة. إذا كان تطبيقك يتيح ميزة "التحكّم بالبثّ"، سيحصل المستخدمون على مرونة في كيفية مشاهدة المحتوى الخاص بك:
- يمكن للمستخدمين إيقاف البرامج مؤقتًا أثناء التعامل مع انقطاع قصير المدى، لكي لا يفوتهم أي مقطع رئيسي.
- يمكن للمستخدمين التقديم السريع للمحتوى الذي رأوه أو المحتوى الذي لا يهمه.
- يمكن للمستخدمين ترجيع اللحظات المفضّلة وإعادة مشاهدتها في محتوى البرنامج.
![](https://developer.android.com/static/images/training/tv/tif/time-shift.png?authuser=5&hl=ar)
الشكل 1. عناصر التحكّم في تشغيل Android TV المستخدَمة لميزة "التحكّم بالبثّ".
تستخدم ميزة التسجيل على الوقت مقاطع قصيرة ومؤقتة ومسجلة لبيانات البرنامج لتنفيذ إمكانية تشغيل البرامج المباشرة. لا يمكن للمستخدمين تشغيل تسجيلات التسجيل هذه خارج جلسة التشغيل الحالية. نتيجةً لذلك، لا يمكنهم استخدام ميزة "التحكّم بالبثّ" لإيقاف أحد البرامج مؤقتًا في اليوم التالي أو إيقاف برنامج لمشاهدته لاحقًا أثناء التبديل إلى قناة مختلفة.
استخدِم واجهات برمجة تطبيقات تسجيل التلفزيون إذا أردت السماح للمستخدمين بتسجيل محتوى البرنامج لمشاهدته خارج جلسة التشغيل الحالية.
إضافة دعم عملية التسجيل على وسيط
لإتاحة هذه الميزة في خدمة إدخال التلفزيون، يجب تنفيذ واجهات برمجة تطبيقات هذه العملية في صف TvInputService.Session
، والتعامل مع تسجيلات هذه العملية وتشغيلها في تطبيقك، وإبلاغ النظام بأنّ خدمة الإدخال التي تستخدمها توفّر إمكانية استخدامها.
إليك أساليب TvInputService.Session
التي تتّبعها:
onTimeShiftGetCurrentPosition()
: يطلب النظام الحصول على موضع التشغيل الحالي بالمللي ثانية. لمزيد من التفاصيل، راجِع القسم تتبُّع أوقات التشغيل.onTimeShiftGetStartPosition()
: يطلب النظام الحصول على موضع بدء التسجيل الحالي لميزة "التحكّم بالبثّ" بالمللي ثانية. لمزيد من التفاصيل، يمكنك الاطّلاع على القسم تتبّع أوقات التشغيل.onTimeShiftPause()
: يتم استدعاء هذه الدالة عندما يوقف المستخدم التشغيل مؤقتًا.onTimeShiftResume()
: يتم استدعاء هذه الدالة عندما يستأنف المستخدم التشغيل.onTimeShiftSeekTo(long)
: يتم استدعاء هذه الدالة عندما يحتاج النظام إلى البحث عن موضع زمني جديد. وعادةً ما يكون الموضع الجديد بين موضع البدء والموضع الحالي.onTimeShiftSetPlaybackParams(PlaybackParams)
: يطلبها النظام لتوفير معلمات تشغيل، مثل سرعة التشغيل، للجلسة الحالية. لمزيد من التفاصيل، راجِع القسم إتاحة معلَمات التشغيل.
لمزيد من المعلومات حول طريقة إعلام النظام بأنّ خدمة الإدخال توفّر ميزة "التحكّم بالبثّ"، يُرجى الاطّلاع على القسم إعلام النظام بشأن حالة التسجيل على الوقت.
إذا كنت تستخدم "المكتبة المصاحبة" في TIF لتنفيذ
صفك في
TvInputService.Session
، ستحصل تلقائيًا على
ميزة "التحكّم بالبثّ" التي تستخدم ExoPlayer. يمكنك استخدام طريقة التنفيذ هذه أو إلغاء طرق واجهة برمجة التطبيقات الخاصة بعملية "التحكّم بالبثّ" في BaseTvInputService.Session
وتقديم طريقة التنفيذ الخاصة بك. لمعرفة مزيد من المعلومات حول استخدام "المكتبة المصاحبة" في TIF، يُرجى الاطّلاع على القسم إنشاء خدمة إدخال تلفزيون باستخدام
"المكتبة المصاحبة" في TIF.
تسجيل المحتوى عند بدء جلسة
يمكن للمستخدم إيقاف محتوى البرنامج مؤقتًا وترجيعه وتقديمه سريعًا بالانتقال إلى عناصر التحكم في التشغيل للقناة، إما بالضغط على اختيار أثناء مشاهدة المحتوى ثم الانتقال إلى عناصر التحكم في التشغيل أو باستخدام عناصر التحكم في التشغيل المخصصة على جهاز بعيد.
بما أنّ المستخدم يمكنه استخدام ميزة "التحكّم بالبثّ" في أي وقت أثناء مشاهدة محتوى البرنامج، يجب أن تبدأ خدمة الإدخال في التلفزيون في تسجيل محتوى هذه الميزة فور انتقال المستخدم إلى القناة أثناء تنفيذ
onTune()
. عليك أيضًا
إبلاغ النظام بأنّه يمكنك التسجيل من خلال استدعاء
notifyTimeShiftStatusChanged(int)
،
على النحو الموضَّح في قسم
إبلاغ النظام بحالة التسجيل.
إدارة تخزين المحتوى المُسجَّل
خدمة إدخال التلفزيون مسؤولة عن تخزين تسجيلات التسجيل على وسيط تخزين في
مساحة تخزين التطبيق الخاص في تطبيقك وتشغيل المحتوى عندما يستدعي النظام
طرق التحكُّم بالبثّ، مثل
onTimeShiftResume()
.
إذا كان المحتوى الخاص بك مخزَّنًا في السحابة الإلكترونية وكان بإمكان تطبيقك إدارة تسجيلات التسجيل على وسيط تخزين في السحابة الإلكترونية، يمكنك استخدام التخزين في السحابة الإلكترونية بدلاً من مساحة تخزين التطبيق.
إذا كان المحتوى الخاص بك يستخدم محتوًى محميًا، تكون خدمة إدخال التلفزيون مسؤولة عن التشفير السليم للمحتوى المسجّل وفك تشفير المحتوى أثناء التشغيل.
بما أنّ محتوى الفيديو المسجَّل يمكن أن يتطلّب مساحة تخزين كبيرة، عليك إدارة المحتوى المسجَّل بعناية أثناء تشغيل الجلسة. إذا كان وقت جلسة التشغيل يتجاوز مقدار الوقت الذي يمكنك تسجيله وتخزينه ضمن عملية التسجيل على الوقت، يمكنك ضبط التسجيل الخاص بهذه العملية للإبقاء على المورد المؤقت الحالي مع التأكد من تسجيل الوقت الحالي. على سبيل المثال، إذا كان المستخدم يشغّل المحتوى لمدة 31 دقيقة وكان الحد الأقصى لحجم التسجيل في عملية تسجيل الوقت هو 30 دقيقة، اضبط التسجيل ووقت البدء بحيث يتضمن محتوى من الدقيقة 1 إلى الدقيقة 31.
إذا كانت خدمة إدخال التلفزيون لا تتوافق مع ميزة "التحكّم بالبثّ" بسبب عدم توفّر مساحة تخزين كافية، يجب إعلام النظام بذلك. للتعرُّف على مزيد من التفاصيل حول كيفية إشعار النظام بشأن قيود الدعم الخاصة بعملية "التحكّم بالبث"، يُرجى الاطّلاع على قسم إبلاغ النظام بحالة عملية التسجيل على الوقت.
عندما يبدّل المستخدم إلى قناة مختلفة أو ينهي جلسة التشغيل بأي طريقة، احذف البيانات المسجّلة الخاصة بعملية التسجيل.
إبلاغ النظام بحالة التسجيل على الوقت
إذا كانت خدمة إدخال التلفزيون توفّر ميزة "التحكّم بالبثّ"، يمكنك الاتصال بـ
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
عند تنفيذ
onTune()
عندما يستمع مستخدم
إلى قناة.
لإبلاغ النظام في حال تغيّر أي من إمكانات التحكُّم بالبث في خدمة الإدخال،
استخدِم notifyTimeShiftStatusChanged(int)
.
على سبيل المثال، إذا كانت خدمة إدخال التلفزيون لا تتوافق مع ميزة "التحكّم بالبثّ"
بسبب قيود مساحة التخزين أو لأسباب أخرى، يمكنك الاتصال بـ
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
.
إذا لم توفّر خدمة إدخال التلفزيون ميزة "التحكّم بالبثّ" على الإطلاق، يمكنك الاتصال على
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
عند إنشاء جلسة تشغيل. يتعامل النظام مع أي خدمة إدخال
لا تستدعي notifyTimeShiftStatusChanged()
مطلقًا
على أنّها خدمة إدخال لا تتيح
ميزة "التحكّم بالبثّ". يتناول هذا خدمات الإدخال باستخدام مستوى واجهة برمجة التطبيقات 22
والإصدارات السابقة.
أوقات تشغيل المقطع الصوتي
إنّ موضع بدء تسجيل عملية التسجيل على الوقت هو أقرب موضع وقت مطلق يمكن أن يسعى المستخدم إليه، بالمللي ثانية منذ البداية. ويكون هذا عادةً هو الوقت الذي يبدأ فيه تشغيل الفيديو بعد
استدعاء onTune()
.
ومع ذلك، عندما يشاهد المستخدم مقدارًا من المحتوى يتجاوز ما يمكن لتطبيقك تسجيله، ستحتاج إلى البدء في تسجيل مقطع جديد من أجل التسجيل على الوقت وتعديل وقت البدء وفقًا لذلك.
الموضع الحالي لتسجيل التحكم بالبث هو موضع التشغيل الحالي بالمللي ثانية منذ البداية. يتغير هذا الموضع باستمرار أثناء التشغيل. يمكنك عادةً استخدام محرّك التشغيل لتحديد هذه القيمة، كما هو موضّح في المثال التالي:
Kotlin
override fun onTimeShiftGetCurrentPosition(): Long = tvPlayer?.run { currentProgram?.let { program -> currentPosition + program.startTimeUtcMillis } } ?: TvInputManager.TIME_SHIFT_INVALID_TIME
Java
@Override public long onTimeShiftGetCurrentPosition() { if (getTvPlayer() != null && currentProgram != null) { return getTvPlayer().getCurrentPosition() + currentProgram.getStartTimeUtcMillis(); } return TvInputManager.TIME_SHIFT_INVALID_TIME; }
تأكَّد من أنّ وقت البدء الذي توفّره عند طلب النظام
onTimeShiftGetStartPosition()
لا يكون أبدًا أكبر من الموضع الزمني الحالي الذي حدّدته في
onTimeShiftGetCurrentPosition()
.
يستخدم النظام عمليات الاستدعاء هذه لتحديث مدة التسجيل الزمني في واجهة مستخدم عناصر التحكم في التشغيل.
دعم معلمات التشغيل
لتغيير سرعة التشغيل أثناء التحكُّم بالبثّ، يستخدم النظام معلمات التشغيل. على سبيل المثال، إذا قرر المستخدم إرجاع التشغيل الحالي، يتم تمرير معلمات تشغيل جديدة إلى التطبيق بسرعة تشغيل سلبية. تتوافق ميزة "التحكّم بالبثّ" أيضًا مع عدّة مستويات مختلفة، مثل 2x أو 3x من سرعة التشغيل، للترجيع أو التقديم السريع.
يستدعي النظام الطريقة
onTimeShiftSetPlaybackParams(PlaybackParams)
باستخدام كائن PlaybackParams
الذي يحتوي على
معلَمات للجلسة الحالية. يمكنك استخدام هذه المعلومات
لإعداد محرك تشغيل الوسائط بشكل مناسب.
إذا كان محرك التشغيل لا يتيح استخدام معلمة، فيمكنك محاكاة السلوك المتوقع على أفضل نحو. على سبيل المثال، إذا كان محرك التشغيل لا يتيح عمل السرعة 2x، فاستخدم عمليات البحث المكررة في محرك التشغيل لتحقيق مضاعفة سرعة التشغيل تقريبًا.
بعد تعيين المعلمات، لا تغيّر الإعدادات إلا إذا أصدر المستخدم أمر تشغيل يتطلب معلمة مختلفة أو ينتقل إلى قناة جديدة.