เปิดใช้ตัวควบคุมการเล่น

หากต้องการเปิดใช้การเล่นสื่อใน Android Auto และ Android Automotive OS (AAOS) ให้ ใช้ตัวควบคุมการเล่นโดยการลงทะเบียนเซสชันสื่อและจัดการ เมธอดการเรียกกลับ หน้านี้จะอธิบายวิธีทำสิ่งต่อไปนี้

  • ลงทะเบียนออบเจ็กต์ MediaSessionCompat ในบริการเบราว์เซอร์สื่อ

  • ใช้เมธอด MediaSessionCompat.Callback เพื่อตอบสนองต่อคำขอการเล่นของผู้ใช้

  • กำหนดค่าการดำเนินการเล่นมาตรฐานและการดำเนินการเล่นที่กำหนดเอง

  • ตั้งค่าสถานะการเล่นเริ่มต้นสำหรับเซสชันสื่อ

  • เพิ่มไอคอนเพื่อระบุรูปแบบเสียง

  • สร้างลิงก์จากรายการสื่อที่กำลังเล่นอยู่

Android Auto และ AAOS จะส่งคำสั่งควบคุมการเล่นผ่าน MediaSessionCompat สำหรับบริการของคุณ คุณต้องลงทะเบียนเซสชันและ ใช้วิธีการเรียกกลับที่เกี่ยวข้อง

ลงทะเบียนเซสชันสื่อ

ในเมธอด onCreate ของบริการเบราว์เซอร์สื่อ ให้สร้างอินสแตนซ์ของ MediaSessionCompat จากนั้นเรียกใช้ setSessionToken เพื่อลงทะเบียน เซสชันสื่อ ข้อมูลโค้ดนี้แสดงวิธีสร้างและลงทะเบียน Media Session

Kotlin

override fun onCreate() {
    super.onCreate()
    ...
    // Start a new MediaSession.
    val session = MediaSessionCompat(this, "session tag").apply {
        // Set a callback object that implements MediaSession.Callback
        // to handle play control requests.
        setCallback(MyMediaSessionCallback())
    }
    sessionToken = session.sessionToken
    ...
}

Java

public void onCreate() {
    super.onCreate();
    ...
    // Start a new MediaSession.
    MediaSessionCompat session = new MediaSessionCompat(this, "session tag");
    setSessionToken(session.getSessionToken());

    // Set a callback object that implements MediaSession.Callback
    // to handle play control requests.
    session.setCallback(new MyMediaSessionCallback());
    ...
}

เมื่อสร้างออบเจ็กต์เซสชันสื่อ คุณจะตั้งค่าออบเจ็กต์การเรียกกลับที่จะใช้ เพื่อจัดการคำขอควบคุมการเล่น คุณสร้างออบเจ็กต์การเรียกกลับนี้ได้โดย ระบุการใช้งานของคลาส MediaSessionCompat.Callback สำหรับแอปของคุณ ส่วนถัดไปจะอธิบายวิธีใช้ออบเจ็กต์นี้

ใช้คำสั่งเล่น

เมื่อผู้ใช้ขอเล่นรายการสื่อจากแอปของคุณ Android Automotive OS และ Android Auto จะใช้คลาส MediaSessionCompat.Callback จากออบเจ็กต์ MediaSessionCompat ของแอปที่ได้จาก บริการเบราว์เซอร์สื่อของแอป เมื่อผู้ใช้ต้องการควบคุมการเล่นเนื้อหา เช่น หยุดเล่นชั่วคราวหรือข้ามไปยังแทร็กถัดไป Android Auto และ Android Automotive OS จะเรียกใช้เมธอดใดเมธอดหนึ่งของออบเจ็กต์การเรียกกลับ

หากต้องการจัดการการเล่นเนื้อหา แอปของคุณต้องขยายคลาส Abstract MediaSessionCompat.Callback และใช้เมธอดที่แอปของคุณรองรับ

ใช้เมธอดเรียกกลับแต่ละรายการต่อไปนี้ที่เหมาะกับประเภทเนื้อหาที่แอปของคุณนำเสนอ

onPrepare
AAOS จะเรียกใช้วิธีนี้เมื่อแหล่งที่มาของสื่อมีการเปลี่ยนแปลง
onPlay

เรียกใช้เมื่อผู้ใช้เลือกเล่นโดยไม่ได้เลือกรายการใดรายการหนึ่ง แอปของคุณต้องเล่นเนื้อหาเริ่มต้นหรือหากหยุดการเล่นชั่วคราวด้วย onPause แอปจะเล่นต่อ

onPlayFromMediaId

เรียกใช้เมื่อผู้ใช้เลือกเล่นรายการที่เฉพาะเจาะจง เมธอดจะรับรหัสที่บริการเบราว์เซอร์สื่อกำหนดให้กับรายการสื่อใน ลำดับชั้นของเนื้อหา

onPlayFromSearch

เรียกใช้เมื่อผู้ใช้เลือกเล่นจากคำค้นหา แอปต้องเลือกตัวเลือกที่เหมาะสมตามสตริงการค้นหาที่ส่งเข้ามา

onPause

เรียกใช้เมื่อผู้ใช้เลือกหยุดเล่น

onSkipToNext

เรียกใช้เมื่อผู้ใช้เลือกข้ามไปยังรายการถัดไป

onSkipToPrevious

เรียกใช้เมื่อผู้ใช้เลือกข้ามไปยังรายการก่อนหน้า

onStop

เรียกใช้เมื่อผู้ใช้เลือกหยุดเล่น ลบล้างวิธีการเหล่านี้ในแอปเพื่อแสดงผลลัพธ์ที่เลือก คุณไม่จำเป็นต้องใช้วิธีการหากแอปไม่รองรับวัตถุประสงค์ของวิธีการนั้นๆ เช่น หากแอปของคุณเล่นไลฟ์สด เช่น การถ่ายทอดสดกีฬา คุณไม่จำเป็นต้องใช้ onSkipToNext แต่ให้ใช้การติดตั้งใช้งานเริ่มต้นของ onSkipToNext แทน

แอปของคุณไม่จำเป็นต้องมีตรรกะพิเศษใดๆ ในการเล่นเนื้อหาผ่านลำโพงของรถยนต์ เมื่อแอปได้รับคำขอให้เล่นเนื้อหา แอปจะเล่นเสียง ในลักษณะเดียวกับที่เล่นเนื้อหาผ่านลำโพงโทรศัพท์หรือ หูฟังของผู้ใช้ Android Auto และ AAOS จะส่งเนื้อหาเสียงไปยังระบบของรถยนต์โดยอัตโนมัติเพื่อเล่นผ่านลำโพงของรถยนต์

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเล่นเนื้อหาเสียงได้ที่ภาพรวมของโปรแกรมเล่นสื่อ ภาพรวมของแอปเสียง และภาพรวมของ ExoPlayer

ตั้งค่าการดำเนินการเล่นมาตรฐาน

Android Auto และ AAOS จะแสดงตัวควบคุมการเล่นตาม การดำเนินการที่เปิดใช้ในออบเจ็กต์ PlaybackStateCompat โดยค่าเริ่มต้น แอปของคุณต้องรองรับการดำเนินการต่อไปนี้

นอกจากนี้ แอปยังรองรับการดำเนินการต่อไปนี้ได้หากเกี่ยวข้องกับเนื้อหาของแอป

นอกจากนี้ คุณยังเลือกสร้างคิวการเล่นเพื่อแสดงต่อผู้ใช้ได้ด้วย โดยเรียกใช้เมธอด setQueue และ setQueueTitle เปิดใช้การดำเนินการ ACTION_SKIP_TO_QUEUE_ITEM และกำหนดการเรียกกลับ onSkipToQueueItem

นอกจากนี้ ยังเพิ่มการรองรับไอคอนกำลังเล่น ซึ่งเป็นตัวบ่งชี้ว่ากำลังเล่นอะไรอยู่ โดยเรียกใช้เมธอด setActiveQueueItemId และส่งรหัสของรายการที่เล่นในคิว คุณต้องอัปเดต setActiveQueueItemId ทุกครั้งที่มีการเปลี่ยนแปลงคิว

Android Auto และ AAOS จะแสดงปุ่มสำหรับแต่ละการดำเนินการที่เปิดใช้ รวมถึง คิวการเล่น เมื่อผู้ใช้คลิกปุ่มเหล่านี้ ระบบจะเรียกใช้แฮนเดิลการเรียกกลับที่เกี่ยวข้องจาก MediaSessionCompat.Callback

จองพื้นที่ที่ไม่ได้ใช้

Android Auto และ AAOS จะสำรองพื้นที่ใน UI สำหรับการดำเนินการ ACTION_SKIP_TO_PREVIOUS และ ACTION_SKIP_TO_NEXT หากแอปไม่รองรับฟังก์ชันใดฟังก์ชันหนึ่งเหล่านี้ Android Auto และ AAOS จะใช้พื้นที่ดังกล่าวเพื่อแสดงการดำเนินการที่กำหนดเองที่คุณสร้างขึ้น

หากไม่ต้องการใส่การดำเนินการที่กำหนดเองในพื้นที่เหล่านั้น คุณสามารถจองพื้นที่ดังกล่าวเพื่อให้ Android Auto และ AAOS เว้นพื้นที่ว่างไว้เมื่อใดก็ตามที่แอปไม่รองรับฟังก์ชันที่เกี่ยวข้อง

โดยให้เรียกใช้เมธอด setExtras พร้อมกับแพ็กเกจข้อมูลเพิ่มเติมที่มีค่าคงที่ซึ่งสอดคล้องกับฟังก์ชันที่สงวนไว้ SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT สอดคล้องกับ ACTION_SKIP_TO_NEXT และ SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV สอดคล้องกับ ACTION_SKIP_TO_PREVIOUS ใช้ค่าคงที่เหล่านี้เป็นคีย์ใน Bundle และใช้บูลีน true เป็นค่า

ตั้งค่า PlaybackState เริ่มต้น

เมื่อ Android Auto และ AAOS สื่อสารกับบริการเบราว์เซอร์สื่อ เซสชันสื่อจะสื่อสารสถานะการเล่นเนื้อหาโดยใช้ PlaybackStateCompat

แอปของคุณไม่ควรเริ่มเล่นเพลงโดยอัตโนมัติเมื่อ AAOS หรือ Android Auto เชื่อมต่อกับบริการเบราว์เซอร์สื่อ แต่ให้ใช้ Android Auto และ AAOS เพื่อเล่นต่อหรือเริ่มเล่นโดยอิงตามสถานะของรถยนต์หรือการดำเนินการของผู้ใช้แทน

โดยให้ตั้งค่า PlaybackStateCompat เริ่มต้นของเซสชันสื่อเป็น STATE_STOPPED, STATE_PAUSED, STATE_NONE หรือ STATE_ERROR

เซสชันสื่อภายใน Android Auto และ AAOS จะมีระยะเวลาเท่ากับ ระยะเวลาการขับรถเท่านั้น ดังนั้นผู้ใช้จึงเริ่มและหยุดเซสชันเหล่านี้บ่อยครั้ง หากต้องการ ส่งเสริมประสบการณ์การใช้งานที่ราบรื่นระหว่างไดรฟ์ ให้ติดตามสถานะเซสชันก่อนหน้าของผู้ใช้ เพื่อให้เมื่อแอปสื่อได้รับคำขอเล่นต่อ ผู้ใช้ จะสามารถเล่นต่อจากจุดที่หยุดไว้ได้โดยอัตโนมัติ เช่น รายการสื่อที่เล่นล่าสุด PlaybackStateCompat และคิว

เพิ่มการดำเนินการเล่นที่กำหนดเอง

คุณสามารถเพิ่มการดำเนินการเล่นที่กำหนดเองเพื่อแสดงการดำเนินการเพิ่มเติมที่แอปสื่อรองรับได้ หากมีพื้นที่เพียงพอ (และคุณไม่ได้จองไว้) Android จะ เพิ่มการดำเนินการที่กำหนดเองลงในตัวควบคุมการขนส่ง มิฉะนั้น การดำเนินการที่กำหนดเองจะปรากฏในเมนูรายการเพิ่มเติม Android จะแสดงการดำเนินการที่กำหนดเองตามลำดับที่คุณเพิ่มลงใน PlaybackStateCompat

ใช้การกระทำที่กำหนดเองเพื่อให้ลักษณะการทำงานแตกต่างจากการกระทำมาตรฐาน อย่าใช้เพื่อแทนที่หรือทำซ้ำการกระทำมาตรฐาน

หากต้องการเพิ่มการดำเนินการที่กำหนดเอง ให้ใช้วิธี addCustomAction ในคลาส PlaybackStateCompat.Builder ข้อมูลโค้ดนี้แสดงวิธีเพิ่ม การดำเนินการที่กำหนดเองลงใน "เริ่มสถานีวิทยุ"

Kotlin

val customActionExtras = Bundle()
customActionExtras.putInt(
  androidx.media3.session.MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT,
  androidx.media3.session.CommandButton.ICON_RADIO)

stateBuilder.addCustomAction(
    PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon // or R.drawable.media3_icon_radio
    ).run {
        setExtras(customActionExtras)
        build()
    }
)

Java

Bundle customActionExtras = new Bundle();
customActionExtras.putInt(
  androidx.media3.session.MediaConstants.EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT,
  androidx.media3.session.CommandButton.ICON_RADIO);

stateBuilder.addCustomAction(
    new PlaybackStateCompat.CustomAction.Builder(
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA,
        resources.getString(R.string.start_radio_from_media),
        startRadioFromMediaIcon) // or R.drawable.media3_icon_radio
    .setExtras(customActionExtras)
    .build());

ดูตัวอย่างวิธีการนี้แบบละเอียดเพิ่มเติมได้ที่เมธอด setCustomAction ในแอปตัวอย่าง Universal Android Music Player บน GitHub หลังจากสร้างการดำเนินการที่กำหนดเองแล้ว เซสชันสื่อจะตอบสนองต่อการดำเนินการได้โดยการลบล้างเมธอด onCustomAction

ข้อมูลโค้ดนี้แสดงวิธีที่แอปของคุณอาจตอบสนองต่อการดำเนินการ "เริ่มสถานีวิทยุ"

Kotlin

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_START_RADIO_FROM_MEDIA -> {
            ...
        }
    }
}

Java

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_START_RADIO_FROM_MEDIA.equals(action)) {
        ...
    }
}

ดูข้อมูลเพิ่มเติมได้ที่เมธอด onCustomAction ในแอปตัวอย่าง Universal Android Music Player บน GitHub

สร้างไอคอนสำหรับการดำเนินการที่กำหนดเอง

การดำเนินการที่กำหนดเองแต่ละรายการที่คุณสร้างต้องมีไอคอน

หากคำอธิบายของไอคอนนั้นตรงกับค่าคงที่ CommandButton.ICON_ อย่างใดอย่างหนึ่ง ให้ตั้งค่าจำนวนเต็มสำหรับคีย์ EXTRAS_KEY_COMMAND_BUTTON_ICON_COMPAT ของส่วน extras ของการดำเนินการที่กำหนดเอง ในระบบที่รองรับ การดำเนินการนี้จะลบล้างทรัพยากรไอคอนที่ส่งไปยัง CustomAction.Builder ซึ่งจะช่วยให้คอมโพเนนต์ของระบบแสดงผลการดำเนินการและ การดำเนินการเล่นอื่นๆ ได้อย่างสอดคล้องกัน

นอกจากนี้ คุณต้องระบุทรัพยากรไอคอนด้วย แอปในรถยนต์สามารถทำงานได้ในหน้าจอที่มีขนาดและความหนาแน่นแตกต่างกันมากมาย ดังนั้นไอคอนที่คุณระบุต้องเป็นVector Drawable ใช้ Vector Drawable เพื่อปรับขนาดชิ้นงานโดยไม่สูญเสียรายละเอียด Vector Drawable สามารถจัดแนวขอบและมุมตามขอบเขตพิกเซลที่มีความละเอียดน้อย

หากการดำเนินการที่กำหนดเองเป็นแบบมีสถานะ (หากสลับการตั้งค่าการเล่นเปิดหรือปิด) ให้ระบุไอคอนที่แตกต่างกันสำหรับสถานะต่างๆ เพื่อช่วยให้ผู้ใช้เห็นการเปลี่ยนแปลงเมื่อ เลือกการดำเนินการ

ระบุรูปแบบไอคอนอื่นสำหรับดำเนินการที่ปิดใช้

เมื่อการกระทำที่กำหนดเองไม่พร้อมใช้งานในบริบทปัจจุบัน ให้สลับไอคอนการกระทำที่กำหนดเอง กับไอคอนอื่นที่แสดงว่าการกระทำถูกปิดใช้

ตัวอย่างไอคอนการทำงานที่กำหนดเองซึ่งไม่ได้อยู่ในรูปแบบ
รูปที่ 1 ตัวอย่างไอคอนการทำงานที่กำหนดเองซึ่งไม่ได้อยู่ในสไตล์

ระบุรูปแบบเสียง

หากต้องการระบุว่าสื่อที่เล่นใช้รูปแบบเสียงพิเศษ คุณสามารถระบุไอคอนที่จะแสดงในรถยนต์ที่รองรับฟีเจอร์นี้ได้ คุณตั้งค่า KEY_CONTENT_FORMAT_TINTABLE_LARGE_ICON_URI และ KEY_CONTENT_FORMAT_TINTABLE_SMALL_ICON_URI ในแพ็กเกจเนื้อหาพิเศษของ รายการสื่อที่กำลังเล่น (ส่งไปยัง MediaSession.setMetadata) ได้ ตั้งค่าทั้ง 2 รายการเพื่อให้รองรับเลย์เอาต์ที่แตกต่างกัน

นอกจากนี้ คุณยังตั้งค่า KEY_IMMERSIVE_AUDIO extra เพื่อแจ้งให้ OEM รถยนต์ทราบว่านี่คือเสียงสมจริง และควรระมัดระวังเป็นอย่างยิ่ง เมื่อตัดสินใจว่าจะใช้เอฟเฟกต์เสียงที่อาจรบกวน เนื้อหาแบบสมจริงหรือไม่

คุณสามารถกำหนดค่ารายการสื่อที่กำลังเล่นเพื่อให้คำบรรยายแทนเสียง คำอธิบาย หรือทั้ง 2 อย่างเป็นลิงก์ไปยังรายการสื่ออื่นๆ ซึ่งจะช่วยให้ผู้ใช้ไปยังรายการที่เกี่ยวข้องได้อย่างรวดเร็ว เช่น อาจไปยังเพลงอื่นๆ ของศิลปินคนเดียวกันหรือ ไปยังตอนอื่นๆ ของพอดแคสต์ หากรถยนต์รองรับฟีเจอร์นี้ ผู้ใช้ จะแตะลิงก์เพื่อเรียกดูเนื้อหานั้นได้

หากต้องการเพิ่มลิงก์ ให้กำหนดค่าข้อมูลเมตา KEY_SUBTITLE_LINK_MEDIA_ID (เพื่อลิงก์จากคำบรรยาย) หรือ KEY_DESCRIPTION_LINK_MEDIA_ID (เพื่อลิงก์จากคำอธิบาย) ดูรายละเอียดได้ที่เอกสารอ้างอิงสำหรับฟิลด์ข้อมูลเมตาเหล่านั้น