เฟรมเวิร์ก Cast มีคลาสการจัดคิวที่รองรับการสร้างรายการMediaQueueItem
อินสแตนซ์ ซึ่งสร้างจากอินสแตนซ์ MediaInfo
เช่น สตรีมวิดีโอหรือเสียง เพื่อเล่นตามลำดับบนอุปกรณ์รับ รายการเนื้อหาในคิวนี้สามารถแก้ไข เรียงลําดับใหม่ อัปเดต และอื่นๆ ได้
Receiver 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()
method - หากมีการโหลดรายการถัดไปไว้ล่วงหน้า ระบบจะแสดงผลรหัสรายการที่โหลดไว้ล่วงหน้าgetLoadingItemId()
method - แสดงผลรหัสของรายการที่กําลังโหลดอยู่ (แต่ไม่ได้อยู่ในคิว) บนเครื่องรับgetCurrentItemId()
method - แสดงผลรหัสรายการของรายการที่ใช้งานอยู่ในคิว (อาจไม่ได้เล่น) ณ เวลาที่มีการเปลี่ยนแปลงสถานะสื่อgetQueueItems()
(เลิกใช้งานแล้ว ให้ใช้MediaQueue
แทน) - แสดงรายการอินสแตนซ์MediaQueueItem
เป็นรายการที่แก้ไขไม่ได้
นอกจากนี้ แอปยังรับรายการรายการโดยใช้คลาส MediaQueue
ได้อีกด้วย คลาสนี้เป็นโมเดลข้อมูลที่ขาดแคลนของคิวสื่อ โดยจะเก็บรายการรหัสสินค้าไว้ในคิว ซึ่งจะซิงค์กับเครื่องรับโดยอัตโนมัติ
MediaQueue
จะไม่เก็บMediaQueueItem
ทั้งหมดไว้เนื่องจากจะกินหน่วยความจํามากเกินไปเมื่อคิวยาวมาก แต่ระบบจะดึงข้อมูลรายการตามคําขอและเก็บLruCache
ของรายการที่เข้าถึงล่าสุดไว้ คุณใช้วิธีต่อไปนี้เพื่อเข้าถึงคิวสื่อได้
getItemIds()
method - แสดงรายการรหัสสินค้าทั้งหมดตามลําดับgetItemAtIndex()
method - แสดงผลรายการที่แคชไว้ที่ดัชนีที่ระบุ หากไม่ได้แคชรายการไว้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
ที่เลือกรายการถัดไป) นํารายการออกจากคิว และจัดเรียงรายการในคิวใหม่