ตัวควบคุมสื่อโต้ตอบกับเซสชันสื่อเพื่อค้นหาและควบคุมสื่อ
การเล่นของแอป ใน Media3 ระบบจะMediaController
API จะใช้อินเทอร์เฟซ Player
ตัวอย่างแอปไคลเอ็นต์ที่ใช้สื่อ
ตัวควบคุมประกอบด้วย
- การควบคุมสื่อของระบบ Android
- แอปที่ใช้ร่วมกับ Android Wear OS
- Android Auto และ Automotive OS
- ผู้ช่วยแบบเสียง เช่น Google Assistant
- แอปทดสอบตัวควบคุมสื่อ
ตัวควบคุมสื่อยังมีประโยชน์ภายในแอปสื่ออีกด้วย ตัวอย่างเช่น
โปรแกรมเล่นสื่อและเซสชันสื่อแสดงอยู่ในService
แยกจากActivity
หรือ
Fragment
ที่มี UI
สร้าง MediaController
หากต้องการสร้าง MediaController
ให้เริ่มต้นด้วยการสร้าง SessionToken
สำหรับ
MediaSession
ที่เกี่ยวข้อง เมธอด onStart()
ของ Activity
หรือ
Fragment
เหมาะที่จะใช้วิธีนี้
Kotlin
val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
Java
SessionToken sessionToken = new SessionToken(context, new ComponentName(context, PlaybackService.class));
การใช้ SessionToken
นี้เพื่อสร้าง MediaController
จะเชื่อมต่อ
กับเซสชันที่ระบุ กระบวนการนี้จะเกิดขึ้นแบบไม่พร้อมกัน คุณจึงควร
ฟังผลลัพธ์และใช้เมื่อสามารถใช้ได้
Kotlin
val controllerFuture = MediaController.Builder(context, sessionToken).buildAsync() controllerFuture.addListener({ // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaController> controllerFuture = new MediaController.Builder(context, sessionToken).buildAsync(); controllerFuture.addListener(() -> { // MediaController is available here with controllerFuture.get() }, MoreExecutors.directExecutor());
ใช้ MediaController
MediaController
จะใช้อินเทอร์เฟซ Player
คุณจึงใช้คำสั่ง
ที่กำหนดไว้ในอินเทอร์เฟซเพื่อควบคุมการเล่น MediaSession
ที่เชื่อมต่ออยู่
นี่เป็นการระบุว่าการโทรหา play()
บน MediaController
จะเป็นการส่ง
ไปยัง MediaSession
ที่เชื่อมต่ออยู่ ซึ่งจะมอบสิทธิ์
ลงใน Player
ที่เกี่ยวข้อง
ในทำนองเดียวกัน คุณเพิ่ม Player.Listener
ลงในตัวควบคุมเพื่อฟังได้
การเปลี่ยนแปลงในสถานะ Player
โปรดดู
คู่มือเหตุการณ์ของผู้เล่น
เพื่อดูรายละเอียดเพิ่มเติมในการใช้ Player.Listener
MediaController.Listener
อินเทอร์เฟซจะกำหนด Callback เพิ่มเติมสำหรับเหตุการณ์และคำสั่งขาเข้าจาก
MediaSession
ที่เชื่อมต่อ เช่น
onAvailableSessionCommandsChanged()
เมื่อเซสชันสื่อเปลี่ยนคำสั่งของเซสชันที่มีอยู่และ
onDisconnected()
เมื่อยกเลิกการเชื่อมต่อตัวควบคุมจากเซสชัน
และเช่นเดียวกับคอมโพเนนต์อื่นๆ อย่าลืมปล่อย MediaController
เมื่อ
ที่ไม่จำเป็นอีกต่อไป เช่น ในเมธอด onStop()
ของ Activity
หรือ
Fragment
Kotlin
MediaController.releaseFuture(controllerFuture)
Java
MediaController.releaseFuture(controllerFuture);
การปล่อยตัวควบคุมจะยังนำส่งคำสั่งที่รอดำเนินการทั้งหมดที่ส่งไปยัง และยกเลิกการเชื่อมโยงจากบริการเซสชันเมื่อคำสั่งเหล่านี้มีการ ได้รับการจัดการหรือหลังจากระยะหมดเวลาแล้ว แล้วแต่ว่ากรณีใดจะเกิดขึ้นก่อน
สร้างและใช้ MediaBrowser
MediaBrowser
สร้างขึ้นต่อยอดความสามารถจาก
MediaController
เพื่อเปิดใช้การเรียกดูคลังสื่อที่สื่อมีให้ด้วย
MediaLibraryService
ของแอป
Kotlin
val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync() browserFuture.addListener({ // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor())
Java
ListenableFuture<MediaBrowser> browserFuture = new MediaBrowser.Builder(context, sessionToken).buildAsync(); browserFuture.addListener(() -> { // MediaBrowser is available here with browserFuture.get() }, MoreExecutors.directExecutor());
หากต้องการเริ่มเรียกดูไลบรารีเนื้อหาของแอปสื่อ ให้เรียกโหนดรูทก่อน
ด้วย getLibraryRoot()
:
Kotlin
// Get the library root to start browsing the library tree. val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null) rootFuture.addListener({ // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor())
Java
// Get the library root to start browsing the library tree. ListenableFuture<LibraryResult<MediaItem>> rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null); rootFuture.addListener(() -> { // Root node MediaItem is available here with rootFuture.get().value }, MoreExecutors.directExecutor());
คุณสามารถไปยังคลังสื่อต่างๆ ได้โดยเรียกข้อมูลรายการย่อยของ
MediaItem
ในคลังกับ getChildren()
ตัวอย่างเช่น หากต้องการดึงข้อมูล
ย่อยของโหนดราก MediaItem
:
Kotlin
// Get the library root to start browsing the library tree. val childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null) childrenFuture.addListener({ // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor())
Java
ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture = mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null); childrenFuture.addListener(() -> { // List of children MediaItem nodes is available here with // childrenFuture.get().value }, MoreExecutors.directExecutor());