เฟรมเวิร์ก Cast มีคลาสการจัดคิวที่รองรับการสร้างรายการอินสแตนซ์ MediaQueueItem
ซึ่งสร้างจากอินสแตนซ์ MediaInfo
เช่น สตรีมวิดีโอหรือเสียง
เพื่อเล่นตามลำดับในตัวรับ คุณสามารถแก้ไข จัดลำดับใหม่ อัปเดต และอื่นๆ ในคิวของรายการเนื้อหานี้ได้
Receiver SDK จะดูแลคิวและตอบสนองต่อการดำเนินการในคิว ตราบใดที่คิวมีรายการที่ใช้งานอยู่ (เล่นหรือ หยุดชั่วคราว) อย่างน้อย 1 รายการ ผู้ส่งจะเข้าร่วมเซสชันและเพิ่มรายการลงในคิวได้ ตัวรับ จะรักษาสถานะเซสชันสำหรับรายการในคิวจนกว่ารายการสุดท้ายจะเล่นเสร็จ หรือ ผู้ส่งจะหยุดเล่นและสิ้นสุดเซสชัน หรือจนกว่าผู้ส่งจะ โหลดคิวใหม่ในตัวรับ โดยค่าเริ่มต้น ตัวรับจะไม่เก็บข้อมูลใดๆ เกี่ยวกับคิวที่สิ้นสุดแล้ว เมื่อรายการสุดท้ายในคิว เล่นจบ เซสชันสื่อจะสิ้นสุดลงและคิวจะหายไป
สร้างและโหลดรายการในคิวสื่อ
รายการในคิวสื่อจะแสดงในเฟรมเวิร์ก Cast เป็นอินสแตนซ์ของ
MediaQueueItem
เมื่อสร้างรายการในคิวสื่อ หากใช้Media Player
Library กับเนื้อหาแบบปรับได้ คุณจะตั้งค่า
เวลาโหลดล่วงหน้าเพื่อให้เพลเยอร์เริ่มบัฟเฟอร์รายการในคิวสื่อได้ก่อนที่
รายการที่อยู่ก่อนหน้าในคิวจะเล่นจบ การตั้งค่าแอตทริบิวต์เล่นอัตโนมัติของรายการเป็นจริงจะช่วยให้ตัวรับสัญญาณเล่นรายการนั้นได้โดยอัตโนมัติ เช่น
คุณสามารถใช้รูปแบบ Builder เพื่อสร้างรายการคิวสื่อได้ดังนี้
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()
เมธอด - แสดงรายการรหัสสินค้าทั้งหมดตามลำดับ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
อัลกอริทึมที่เลือกรายการถัดไป) นำรายการออกจากคิว และจัดเรียงรายการในคิวใหม่