เชื่อมต่อกับแอปสื่อ

ตัวควบคุมสื่อโต้ตอบกับเซสชันสื่อเพื่อค้นหาและควบคุมสื่อ การเล่นของแอป ใน Media3 ระบบจะMediaController API จะใช้อินเทอร์เฟซ Player ตัวอย่างแอปไคลเอ็นต์ที่ใช้สื่อ ตัวควบคุมประกอบด้วย

ตัวควบคุมสื่อยังมีประโยชน์ภายในแอปสื่ออีกด้วย ตัวอย่างเช่น โปรแกรมเล่นสื่อและเซสชันสื่อแสดงอยู่ใน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());