เฟรมเวิร์กการแคสต์มีคลาสการจัดคิวที่รองรับการสร้างรายการอินสแตนซ์ MediaQueueItem
ซึ่งสามารถสร้างจากอินสแตนซ์ MediaInfo
อย่างเช่นสตรีมวิดีโอหรือเสียง เพื่อเล่นตามลำดับบนตัวรับ ซึ่งคิวของรายการเนื้อหานี้
สามารถแก้ไข เรียงลำดับใหม่ อัปเดต ฯลฯ
SDK ของผู้รับจะรักษาคิวและตอบสนองต่อการดำเนินการในคิวตราบใดที่คิวมีรายการที่ใช้งานอยู่อย่างน้อย 1 รายการในขณะนี้ (กำลังเล่นหรือหยุดชั่วคราว) ผู้ส่งสามารถเข้าร่วมเซสชันและเพิ่มรายการลงในคิวได้ ผู้รับจะเก็บรักษาเซสชันสำหรับรายการในคิวไว้จนกว่ารายการสุดท้ายจะเล่นจบ หรือผู้ส่งหยุดการเล่นและสิ้นสุดเซสชัน หรือจนกว่าผู้ส่งจะโหลดคิวใหม่บนเครื่องรับ รีซีฟเวอร์จะไม่เก็บรักษาข้อมูลใดๆ เกี่ยวกับคิวที่สิ้นสุดลงแล้วโดยค่าเริ่มต้น เมื่อรายการสุดท้ายในคิวเสร็จสมบูรณ์แล้ว เซสชันสื่อจะสิ้นสุดลงและคิวจะหายไป
สร้างและโหลดรายการคิวสื่อ
รายการคิวสื่อจะแสดงในเฟรมเวิร์กแคสต์เป็นอินสแตนซ์ MediaQueueItem
เมื่อสร้างรายการคิวสื่อ หากคุณใช้ไลบรารีโปรแกรมเล่นสื่อที่มีเนื้อหาแบบปรับอัตโนมัติ คุณสามารถตั้งค่าเวลาที่ใช้ในการโหลดล่วงหน้าเพื่อให้โปรแกรมเล่นเริ่มบัฟเฟอร์รายการคิวสื่อก่อนที่รายการก่อนหน้านั้นในคิวจะเล่นจนเสร็จสิ้น การตั้งค่าแอตทริบิวต์การเล่นอัตโนมัติของรายการ
เป็น "จริง" จะทำให้ผู้รับเล่นโดยอัตโนมัติ ตัวอย่างเช่น คุณสามารถใช้รูปแบบเครื่องมือสร้างเพื่อสร้างรายการคิวสื่อได้ดังนี้
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20.0) .build()
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20) .build();
โหลดอาร์เรย์ของรายการคิวสื่อในคิวโดยใช้เมธอด queueLoad
ที่เหมาะสมของ RemoteMediaClient
รับการอัปเดตสถานะคิวสื่อ
เมื่อตัวรับโหลดรายการคิวสื่อ ตัวรับสัญญาณจะกำหนดรหัสที่ไม่ซ้ำกันให้กับรายการ ซึ่งจะคงอยู่ตลอดช่วงเวลาของเซสชัน (และตลอดอายุของคิว) แอปของคุณสามารถเรียนรู้สถานะของคิวในแง่ของรายการที่กำลังโหลด (ซึ่งอาจไม่ได้เล่น) กำลังโหลด หรือโหลดล่วงหน้า ชั้นเรียน MediaStatus
จะให้ข้อมูลสถานะต่อไปนี้
- วิธีการ
getPreloadedItemId()
- หากมีการโหลดรายการถัดไปล่วงหน้า ให้ส่งรหัสรายการที่โหลดไว้ล่วงหน้ากลับมา getLoadingItemId()
method - แสดงผลรหัสสินค้าของสินค้าที่กำลังโหลดอยู่ (แต่ไม่ได้ใช้งานในคิว) บนตัวรับgetCurrentItemId()
method - แสดงผลรหัสสินค้าของสินค้าที่ใช้งานอยู่ในคิว (อาจไม่ได้เล่น) ในเวลาที่มีการเปลี่ยนสถานะสื่อgetQueueItems()
(เลิกใช้งาน, ใช้MediaQueue
แทน) - แสดงผลรายการของอินสแตนซ์MediaQueueItem
เป็นรายการที่แก้ไขไม่ได้
แอปยังดูรายการโดยใช้คลาส MediaQueue
ได้ด้วย คลาสเป็นโมเดลข้อมูลแบบกระจัดกระจายของคิวสื่อ ที่จัดเก็บรายการรหัสสินค้าอยู่ในคิว ซึ่งจะซิงค์กับผู้รับโดยอัตโนมัติ
MediaQueue
ไม่ได้เก็บMediaQueueItem
ทั้งหมดไว้เนื่องจากจะใช้หน่วยความจำมากเกินไปเมื่อคิวยาวมาก แต่จะดึงข้อมูลรายการแบบออนดีมานด์และเก็บรายการที่เข้าถึงล่าสุดไว้ LruCache
รายการ คุณใช้วิธีการเหล่านี้เพื่อเข้าถึงคิวสื่อได้
getItemIds()
method - แสดงผลรายการรหัสสินค้าทั้งหมดตามลำดับgetItemAtIndex()
- แสดงผลรายการที่แคชไว้ตามดัชนีที่ระบุ หากรายการไม่ได้แคชไว้MediaQueue
จะส่งกลับnull
และกำหนดเวลาเพื่อดึงข้อมูลรายการนั้น เมื่อดึงข้อมูลสินค้าแล้ว ระบบจะเรียกใช้MediaQueue.Callback#itemsUpdatedAtIndexes()
และการเรียกใช้getItemAtIndex()
ด้วยรหัสเดียวกันอีกครั้งจะเป็นการส่งคืนสินค้า- ระบบจะใช้
fetchMoteItemsRelativeToIndex()
เมื่อผู้ใช้เลื่อน UI ของคิวไปที่ด้านบนหรือด้านล่าง และแอปต้องการดึงข้อมูลรายการอื่นๆ จากระบบคลาวด์
ใช้วิธีการเหล่านี้ร่วมกับวิธีการแสดงสถานะสื่ออื่นๆ เพื่อแจ้งให้แอปของคุณทราบถึงสถานะของคิวและรายการต่างๆ ในคิว นอกจากการอัปเดตสถานะสื่อจากตัวรับแล้ว แอปของคุณยังตรวจจับการเปลี่ยนแปลงของคิวได้โดยใช้ RemoteMediaClient.Callback
และ MediaQueue.Callback
นอกจากนี้ Cast SDK ยังมีคลาสยูทิลิตี 2 คลาสเพื่อสร้าง UI สำหรับการจัดคิว
MediaQueueRecyclerViewAdapter
สำหรับการสำรองข้อมูลของRecyclerView
MediaQueueListAdapter
สำหรับการสำรองข้อมูลของListAdapter
เช่น หากต้องการสร้าง 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 }
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
ที่เลือกรายการถัดไป) นำรายการออกจากคิว และจัดเรียงรายการในคิวใหม่