الوضع في قائمة الانتظار

يوفِّر إطار عمل البث صفوفًا في "قائمة المحتوى التالي" تتيح إنشاء قوائم مثيل MediaQueueItem يمكن إنشاؤها من مثيلات MediaInfo، مثل فيديوهات بث فيديو أو بث صوتي، لتشغيلها بشكل تسلسلي على جهاز الاستقبال. يمكن تعديل قائمة الانتظار الخاصة بعناصر المحتوى هذه وإعادة ترتيبها وتحديثها وما إلى ذلك.

تحتفظ حزمة SDK للمستلِمين بقائمة الانتظار وتستجيب للعمليات في قائمة الانتظار ما دامت قائمة الانتظار تتضمّن عنصرًا واحدًا على الأقل نشِطًا (قيد التشغيل أو التوقّف مؤقتًا). يمكن للمرسلين الانضمام إلى الجلسة وإضافة عناصر إلى قائمة الانتظار. ويحتفظ المتلقي بجلسة لعناصر قائمة الانتظار حتى يكتمل العنصر الأخير التشغيل أو حتى يوقف المرسل التشغيل وينهي الجلسة، أو حتى يحمّل المرسِل قائمة انتظار جديدة على المُستلِم. لا يحتفظ المتلقي بأي معلومات حول قوائم الانتظار التي تم إنهاؤها افتراضيًا. بمجرد انتهاء العنصر الأخير في قائمة الانتظار، تنتهي جلسة الوسائط وتختفي قائمة الانتظار.

إنشاء عناصر قائمة انتظار الوسائط وتحميلها

يتم تمثيل عنصر قائمة انتظار الوسائط في إطار عمل البثّ كمثيل MediaQueueItem. عند إنشاء عنصر في قائمة انتظار الوسائط، إذا كنت تستخدم مكتبة مشغّل الوسائط مع محتوى تكيّفي، يمكنك ضبط وقت التحميل المسبق لكي يتمكن المشغّل من البدء في التخزين المؤقت لعنصر قائمة انتظار الوسائط قبل انتهاء تشغيل العنصر الذي يسبقه في قائمة الانتظار. يؤدي ضبط سمة التشغيل التلقائي للعنصر على "صحيح" إلى السماح للمُستلِم بتشغيله تلقائيًا. على سبيل المثال، يمكنك استخدام نمط منصة إنشاء لإنشاء عنصر قائمة انتظار الوسائط على النحو التالي:

كولين
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

يمكنك تحميل مصفوفة من عناصر قائمة انتظار الوسائط في قائمة الانتظار باستخدام طريقة queueLoad المناسبة RemoteMediaClient.

تلقّي آخر المعلومات بشأن حالة قائمة انتظار الوسائط

عندما يحمّل المستلم عنصر قائمة انتظار الوسائط، فإنه يعيّن معرّفًا فريدًا للعنصر الذي يستمر طوال مدة الجلسة (ومدة قائمة الانتظار). يمكن لتطبيقك التعرّف على حالة قائمة الانتظار من حيث العنصر الذي تم تحميله حاليًا (قد لا يكون قيد التشغيل) أو قيد التحميل أو محمَّل مُسبَقًا. تقدّم الفئة MediaStatus معلومات الحالة التالية:

  • getPreloadedItemId(): إذا تم تحميل السلعة التالية مسبقًا، يتم عرض معرّف السلعة الذي تم تحميله مسبقًا.
  • الطريقة getLoadingItemId(): لعرض معرّف السلعة للعنصر الذي يتم تحميله حاليًا (ولكنه غير نشط في قائمة الانتظار) على المُستلِم.
  • الطريقة getCurrentItemId(): تعرض معرّف السلعة للعنصر الذي كان نشطًا في قائمة الانتظار (قد لا يكون قيد التشغيل) وقت حدوث تغيير حالة الوسائط.
  • getQueueItems() (تم الإيقاف، استخدِم MediaQueue بدلاً من ذلك): لعرض قائمة MediaQueueItem مثيلات كقائمة غير قابلة للتعديل.

يمكن لتطبيقك أيضًا الحصول على قائمة بالعناصر باستخدام الفئة MediaQueue. الفئة هي نموذج بيانات متفرق لقائمة انتظار الوسائط. ويحتفظ بقائمة معرفات العناصر في قائمة الانتظار، والتي تتم مزامنتها تلقائيًا مع المستلم. لا يحتفظ MediaQueue بجميع MediaQueueItem لأنه سيستغرق الكثير من الذاكرة عندما تكون قائمة الانتظار طويلة جدًا. بدلاً من ذلك، يجلب العناصر عند الطلب ويحتفظ LruCache بالعناصر التي تم الوصول إليها مؤخرًا. يمكنك استخدام الطرق التالية للوصول إلى قائمة انتظار الوسائط:

  • الطريقة getItemIds(): تعرض قائمة بجميع معرّفات السلع بالترتيب.
  • الطريقة getItemAtIndex(): لعرض العنصر المخزّن مؤقتًا في فهرس معيّن. إذا لم يتم تخزين العنصر مؤقتًا، سيعرض MediaQueue العنصر null ويحدِّد موعدًا لاسترجاعه. عند استرجاع السلعة، سيتم الاتصال بـ MediaQueue.Callback#itemsUpdatedAtIndexes()، وسيؤدي استدعاء getItemAtIndex() بالمعرّف نفسه مرة أخرى إلى عرض المنتج.
  • يتم استخدام fetchMoteItemsRelativeToIndex() عندما يمرّر المستخدم واجهة مستخدم قائمة المحتوى التالي إلى الأعلى أو الأسفل، ويريد تطبيقك جلب المزيد من العناصر من السحابة الإلكترونية.

استخدم هذه الطرق مع غيرها من طرق حالة الوسائط لإخبار التطبيق بحالة قائمة الانتظار والعناصر الأخرى فيها. بالإضافة إلى تحديثات حالة الوسائط من المُستلِم، يمكن لتطبيقك رصد أي تغييرات في قائمة الانتظار عن طريق تنفيذ RemoteMediaClient.Callback وMediaQueue.Callback.

بالإضافة إلى ذلك، توفر حزمة Cast SDK فئتين من الخدمات لإنشاء واجهة مستخدم من أجل إضافة الفيديوهات إلى "قائمة المحتوى التالي".

على سبيل المثال، لإنشاء RecyclerView باستخدام MediaQueueRecyclerViewAdapter:

كولين
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

تعديل قائمة المحتوى التالي

للعمل على العناصر في قائمة الانتظار، استخدِم طُرق قائمة الانتظار للفئة RemoteMediaClient. وهي تتيح لك تحميل مصفوفة من العناصر إلى قائمة انتظار جديدة وإدراج عناصر في قائمة انتظار حالية وتعديل خصائص العناصر في قائمة الانتظار وتحريك عنصر للأمام أو الخلف في قائمة الانتظار وضبط خصائص قائمة الانتظار نفسها (على سبيل المثال، تغيير خوارزمية repeatMode التي تختار العنصر التالي) وإزالة العناصر من قائمة الانتظار وإعادة ترتيب العناصر في قائمة الانتظار.