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

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

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

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

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

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

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

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

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

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

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

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 จะเรียกใช้เมธอดใดเมธอดหนึ่งของออบเจ็กต์เรียกกลับ

หากต้องการจัดการการเล่นเนื้อหา แอปของคุณต้องขยายคลาส 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 ใช้ค่าคงที่เหล่านี้เป็นคีย์ในชุดข้อมูล และใช้ค่าบูลีน 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 ของข้อมูลเพิ่มเติมของการทำงานที่กำหนดเอง ในระบบที่รองรับ การดำเนินการดังกล่าวจะลบล้างทรัพยากรไอคอนที่ส่งไปยัง CustomAction.Builder ซึ่งช่วยให้คอมโพเนนต์ของระบบแสดง การทำงานและการทำงานของการเล่นอื่นๆ ได้อย่างสอดคล้องกัน

นอกจากนี้ คุณต้องระบุทรัพยากรไอคอนด้วย แอปในรถยนต์สามารถทำงานบนหน้าจอที่มีขนาดและความหนาแน่นต่างๆ ได้ ดังนั้นไอคอนที่คุณระบุต้องเป็น ภาพวาดแบบเวกเตอร์ ใช้ 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 เพื่อบอก OEM รถยนต์ว่านี่คือเสียงสมจริง และ OEM ควรระมัดระวังอย่างยิ่ง เมื่อตัดสินใจว่าจะใช้เอฟเฟกต์เสียงที่อาจรบกวนเนื้อหาที่สมจริงหรือไม่

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

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