อยู่ในคิว

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

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

สร้างและโหลดรายการในคิวสื่อ

รายการในคิวสื่อจะแสดงในเฟรมเวิร์ก Cast เป็นอินสแตนซ์ของ MediaQueueItem เมื่อสร้างรายการในคิวสื่อ หากใช้Media Player Library กับเนื้อหาแบบปรับได้ คุณจะตั้งค่า เวลาโหลดล่วงหน้าเพื่อให้เพลเยอร์เริ่มบัฟเฟอร์รายการในคิวสื่อได้ก่อนที่ รายการที่อยู่ก่อนหน้าในคิวจะเล่นจบ การตั้งค่าแอตทริบิวต์เล่นอัตโนมัติของรายการเป็นจริงจะช่วยให้ตัวรับสัญญาณเล่นรายการนั้นได้โดยอัตโนมัติ เช่น คุณสามารถใช้รูปแบบ Builder เพื่อสร้างรายการคิวสื่อได้ดังนี้

Kotlin
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() method - หากโหลดรายการถัดไปไว้ล่วงหน้าแล้ว จะแสดงผลรหัสของรายการที่โหลดไว้ล่วงหน้า
  • getLoadingItemId() method - แสดงรหัสสินค้าของสินค้าที่กำลังโหลด (แต่ไม่ได้ อยู่ในคิว) บนตัวรับ
  • getCurrentItemId() method - แสดงผลรหัสของรายการที่ใช้งานอยู่ในคิว (อาจไม่ได้เล่น) ในเวลาที่สถานะสื่อมีการเปลี่ยนแปลง
  • getQueueItems() (เลิกใช้งานแล้ว ให้ใช้ MediaQueue แทน) - แสดงรายการอินสแตนซ์ MediaQueueItem เป็นรายการที่แก้ไขไม่ได้

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

  • getItemIds() เมธอด - แสดงรายการรหัสสินค้าทั้งหมดตามลำดับ
  • getItemAtIndex() method - แสดงผลรายการที่แคชไว้ที่ดัชนีที่ระบุ หากไม่มีการแคชรายการ MediaQueue จะแสดงผล null และกำหนดเวลาเพื่อดึงข้อมูลรายการ เมื่อดึงข้อมูลรายการ MediaQueue.Callback#itemsUpdatedAtIndexes() จะได้รับการเรียกใช้ และการเรียกใช้ getItemAtIndex() ด้วยรหัสเดียวกันอีกครั้งจะ แสดงผลรายการ
  • fetchMoteItemsRelativeToIndex() จะใช้เมื่อผู้ใช้เลื่อน UI คิวไปที่ด้านบนหรือด้านล่าง และแอปของคุณต้องการดึงข้อมูลเพิ่มเติมจากระบบคลาวด์

ใช้วิธีการเหล่านี้ร่วมกับวิธีการสถานะสื่ออื่นๆ เพื่อแจ้งให้แอปทราบเกี่ยวกับสถานะของคิวและรายการในคิว นอกเหนือจาก การอัปเดตสถานะสื่อจากตัวรับแล้ว แอปยังสามารถฟังการเปลี่ยนแปลงคิวได้โดยการใช้ RemoteMediaClient.Callback และ MediaQueue.Callback

นอกจากนี้ Cast SDK ยังมีคลาสยูทิลิตี 2 คลาสสำหรับสร้าง UI สำหรับการจัดคิว

เช่น หากต้องการสร้าง RecyclerView โดยใช้ MediaQueueRecyclerViewAdapter ให้ทำดังนี้

Kotlin
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อัลกอริทึมที่เลือกรายการถัดไป) นำรายการออกจากคิว และจัดเรียงรายการในคิวใหม่