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