โฟกัสอัตโนมัติ

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

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

การโต้ตอบโฟกัส

เพื่อรองรับ AAOS ระบบจะจัดการคำขอโฟกัสเสียงตาม การโต้ตอบที่กำหนดไว้ล่วงหน้าระหว่าง CarAudioContext ของคำขอกับ ผู้ถือครองโฟกัสปัจจุบัน การโต้ตอบมี 3 ประเภท ได้แก่

  • พิเศษ
  • ปฏิเสธ
  • พร้อมกัน

การโต้ตอบแบบพิเศษ

นี่คือรูปแบบการโต้ตอบที่ใช้กันโดยทั่วไปกับ Android

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

ปฏิเสธการโต้ตอบ

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

การโต้ตอบพร้อมกัน

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

  • คำขอโฟกัสขาเข้าต้องขอ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

  • ผู้ถือครองโฟกัสปัจจุบันไม่ได้setPauseWhenDucked(true)

  • ผู้ถือโฟกัสปัจจุบันเลือกที่จะไม่รับเหตุการณ์ลดเสียง

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

จัดการสตรีมพร้อมกัน

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

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

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

เมทริกซ์การโต้ตอบ

ตารางนี้แสดงเมทริกซ์การโต้ตอบตามที่กำหนดโดย CarAudioService แต่ละแถวแสดง CarAudioContext ของผู้ถือโฟกัสปัจจุบัน และแต่ละคอลัมน์แสดงของคำขอขาเข้า

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

เนื่องจากการโต้ตอบพร้อมกัน จึงอาจมีผู้ถือโฟกัสมากกว่า 1 คน ในกรณีนี้ ระบบจะเปรียบเทียบคำขอโฟกัสขาเข้ากับผู้ถือครองโฟกัสปัจจุบันแต่ละรายก่อนที่จะพิจารณาว่าควรใช้การโต้ตอบใด ใน กรณีนี้ การโต้ตอบที่เข้มงวดที่สุดจะเป็นผู้ชนะ ปฏิเสธ แล้วจึงเป็นแบบเฉพาะ และ สุดท้ายคือแบบพร้อมกัน

เมทริกซ์การโต้ตอบโฟกัสเสียง

รูปที่ 1 เมทริกซ์การโต้ตอบโฟกัสเสียง

ใน Android 11 มีการเปิดตัวการตั้งค่าผู้ใช้ใหม่เพื่อให้ผู้ใช้เปลี่ยน ลักษณะการโต้ตอบระหว่างการนำทางและการโทรได้ เมื่อตั้งค่าแล้ว android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL จะเปลี่ยน การโต้ตอบระหว่างคำขอโฟกัส NAVIGATION ที่เข้ามากับผู้ถือโฟกัส CALL ปัจจุบันจากพร้อมกันเป็นปฏิเสธ หากผู้ใช้ต้องการให้ คำสั่งการนำทางไม่ขัดจังหวะการโทร ก็เปิดใช้การตั้งค่าได้ ระบบจะบันทึกค่านี้ไว้สำหรับผู้ใช้ และสามารถตั้งค่าแบบไดนามิกเพื่อให้คำขอโฟกัสในภายหลังเป็นไปตามการตั้งค่าใหม่

โฟกัสเสียงที่หน่วงเวลาได้

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

กฎสำหรับคำขอโฟกัสเสียงที่ล่าช้า

  • คำขอที่ไม่ใช่คำขอชั่วคราวเท่านั้น คุณจะส่งคำขอที่ล่าช้าได้เฉพาะแหล่งที่มาที่ไม่ใช่ชั่วคราวเพื่อหลีกเลี่ยงไม่ให้เสียงชั่วคราวเล่นนานหลังจากที่เกี่ยวข้อง

  • คุณเลื่อนคำขอได้ครั้งละ 1 รายการเท่านั้น หากมีการส่งคำขอที่สามารถหน่วงเวลาได้ ในขณะที่มีคำขอที่หน่วงเวลาอยู่แล้ว คำขอที่หน่วงเวลาเดิม จะได้รับAUDIOFOCUS_LOSSเหตุการณ์การเปลี่ยนแปลง และคำขอใหม่จะได้รับการตอบกลับแบบซิงโครนัสของ AUDIOFOCUS_REQUEST_DELAYED

  • คำขอที่เลื่อนเวลาได้ต้องมี OnAudioFocusChangeListener หลังจากที่ คำขอถูกเลื่อนออกไป ระบบจะใช้ Listener เพื่อแจ้งให้ผู้ส่งคำขอทราบเมื่อ คำขอได้รับอนุมัติในที่สุด (AUDIOFOCUS_GAIN) หรือหากถูกปฏิเสธในภายหลัง (AUDIOFOCUS_LOSS)

ขอโฟกัสที่หน่วงเวลาได้

วิธีสร้างคำขอที่สามารถเลื่อนเวลาได้

  1. ใช้ AudioFocusRequest.Builder#setAcceptsDelayedFocusGain

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. เมื่อส่งคำขอ ให้จัดการAUDIOFOCUS_REQUEST_DELAYEDการตอบกลับดังนี้

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. เมื่อคำขอเกิดความล่าช้า Listener โฟกัสจะจัดการการเปลี่ยนแปลงโฟกัส ดังนี้

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                            // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                            // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                            // Stop media
    

การจางที่ระบบบังคับ

Android 15 เปิดตัวการค่อยๆ เพิ่มเสียงที่บังคับใช้โดยระบบใน AAOS ใน Android ระบบไม่ได้บังคับใช้ โฟกัสเสียง ดังนั้น แม้ว่าเราจะ สนับสนุนให้นักพัฒนาแอปปฏิบัติตามหลักเกณฑ์การโฟกัสเสียง แต่หากแอปยังคง เล่นเสียงดังแม้ว่าจะสูญเสียการโฟกัสเสียงไปแล้ว ระบบก็ไม่สามารถป้องกันได้

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

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

การออกแบบระดับสูง

รูปภาพต่อไปนี้แสดงการออกแบบระดับสูงและการรองรับฟีเจอร์การสูญเสียโฟกัส ในรถยนต์

การออกแบบระดับสูงสำหรับฟีเจอร์การจางที่ระบบบังคับใช้

รูปที่ 2 การออกแบบระดับสูงสำหรับฟีเจอร์การจางที่ระบบบังคับใช้

  • การจางเสียงที่กำหนดเป้าหมาย: การบังคับใช้การจางเสียงใน Android 15 ของระบบออกแบบมาโดยเฉพาะสำหรับสถานการณ์ที่แอปสูญเสียโฟกัสเสียงแต่ยังคงเล่นเสียงต่อไป
  • กลไกการจางเสียง: เมื่อแอปสูญเสียโฟกัสเสียงให้กับแอปที่ขอใหม่
    • เฟรมเวิร์กเสียงจะค่อยๆ ลดเสียงของแอปที่แพ้โดยอัตโนมัติ
    • หลังจากเฟดเอาต์แล้ว ระบบจะปิดเสียงสตรีมเสียง
    • จากนั้นแอปจะได้รับการแจ้งเตือนว่าสูญเสียโฟกัสเสียง
    • ระบบจะปิดเสียงแอปที่ทำงานไม่ถูกต้องจนกว่าแอปจะกลับมามีโฟกัสเสียงอีกครั้ง
    • ตรรกะเริ่มต้นคือการค่อยๆ แสดงแอปที่จางหายไปหลังจากผ่านไป 2 วินาที อย่างไรก็ตาม OEM สามารถกำหนดค่านี้เป็นค่าระยะหมดเวลาใดก็ได้
    • เฟรมเวิร์กเสียงใช้การกำหนดค่า OEM สำหรับทั้งการจางหายและการจางเข้า
  • ไฟล์การกำหนดค่า OEM: Android 15 มีไฟล์การกำหนดค่าใหม่ car_audio_fade_configuration.xml:

    • ไฟล์นี้ช่วยให้ OEM กำหนดเกณฑ์สำหรับเวลาที่ระบบจะบังคับใช้การโฟกัสเสียง กับแอปที่เสียการโฟกัส
    • เฟรมเวิร์กเสียงจะบังคับใช้การจางหายและการปิดเสียงก็ต่อเมื่อแอปที่เสียสละตรงกับกฎที่ OEM กำหนดไว้ในไฟล์ XML นี้
    • ซึ่งเป็นกลไกให้ OEM ปรับแต่งลักษณะการทำงานของฟีเจอร์ตามลักษณะของแอปหรือประเภทการใช้งานเสียงได้
  • การควบคุมฟีเจอร์ด้วย RRO: เราได้เปิดตัวฟีเจอร์ใหม่ของโอเวอร์เลย์ทรัพยากรขณะรันไทม์ (RRO) flag audioUseFadeManagerConfiguration เพื่อเปิดหรือ ปิดใช้ฟีเจอร์นี้

    • ฟีเจอร์นี้ปิดใช้อยู่โดยค่าเริ่มต้น
    • หากต้องการเปิดใช้งานการสูญเสียโฟกัสเสียงที่บังคับใช้โดยระบบ OEM ต้อง ตั้งค่าสถานะนี้เป็น true
    • แม้ว่าเฟรมเวิร์กเสียงในรถยนต์จะคาดหวังคำจำกัดความการกำหนดค่าการเฟดที่ถูกต้องเมื่อเปิดใช้ แฟล็ก แต่การไม่มีคำจำกัดความดังกล่าวไม่ได้ส่งผลให้เกิดข้อยกเว้นร้ายแรงโดยอัตโนมัติ
    • แอปทั้งหมดของกำหนดค่าการจางต้องมีคำจำกัดความการจางที่ตรงกัน การเรียกใช้การกำหนดค่าเฟด (ตามชื่อ) เป็นส่วนหนึ่งของการกำหนดค่าเครื่องเสียงในรถยนต์โดยไม่ได้ระบุคำจำกัดความที่ถูกต้องถือเป็นข้อผิดพลาดร้ายแรง
    • เมื่อปิดใช้ฟีเจอร์นี้ ระบบจะไม่สนใจคำจำกัดความการกำหนดค่าการจางทั้งหมดและการอ้างอิงการกำหนดค่า

การกำหนดค่า Fade Manager

เฟรมเวิร์กเสียงของ Android 15 เปิดตัวFadeManagerConfiguration แบบรวมเพื่อให้ OEM ควบคุมลักษณะการทำงานของการจางเสียงได้อย่างละเอียด กรอบงานนี้ แสดงในรูปที่ 3 ดังนี้

การกำหนดค่า Fade Manager

รูปที่ 3 การกำหนดค่า Fade Manager

การกำหนดค่านี้ประกอบด้วย

  • คุณสมบัติการเปลี่ยนภาพแบบจางลง: การตั้งค่าทั้งการจางออกและการจางเข้า
    • กำหนดได้โดยใช้การใช้งานหรือแอตทริบิวต์ของเสียงที่เฉพาะเจาะจง
    • อนุญาตให้ตั้งค่าระยะเวลาที่กำหนดเอง
    • การตั้งค่าเหล่านี้ใช้ในการสร้าง VolumeShaper.Configuration
  • นโยบายการจาง: กฎที่ควบคุมเวลาที่การจางจะเกิดขึ้น
    • ปุ่มเปิด/ปิดส่วนกลางเพื่อเปิดหรือปิดใช้การจาง
    • รายการการใช้งานเสียงที่กำหนดค่าได้ซึ่งสามารถจางหายไป (มีสิทธิ์จางหายไปเมื่อ สูญเสียโฟกัส)
    • รายการการยกเว้น (จางไม่ได้) จะป้องกันไม่ให้แหล่งเสียงที่สำคัญหรือที่กำหนด จาง รายการเหล่านี้อาจอิงตามข้อมูลต่อไปนี้
      • ประเภทเนื้อหา
      • แอตทริบิวต์เสียง
      • UID ของแอป (ตั้งค่าได้เฉพาะในระหว่างรันไทม์)

การกำหนดค่า OEM

ในส่วนนี้ เราจะดูการปรับแต่ง OEM ที่มี

ไฟล์ XML การกำหนดค่าการเฟดเสียงของรถยนต์

Android 15 เปิดตัวไฟล์การกำหนดค่าใหม่ car_audio_fade_configuration.xml ซึ่งช่วยให้ OEM ปรับแต่งลักษณะการทำงานของการจางเสียงออกได้อย่างครอบคลุม เมื่อสูญเสียโฟกัส

  • ไฟล์ XML นี้ช่วยให้กำหนดค่าการจางหลายแบบที่แตกต่างกันได้ โดยแต่ละแบบต้องมีชื่อที่ไม่ซ้ำกันเพื่อใช้ในการอ้างอิงโยงภายใน car_audio_configuration.xml
  • การกำหนดค่าเหล่านี้สามารถนำไปใช้ได้อย่างยืดหยุ่นในโซนเสียงและการกำหนดค่าโซนต่างๆ
  • โปรดทราบว่าการกำหนดค่าการจางแต่ละรายการยอมรับเฉพาะค่าระยะเวลาเป็นมิลลิวินาที ซึ่งระบบจะใช้เพื่อสร้าง VolumeShaper.Configuration ที่เกี่ยวข้องภายใน

โปรดดูคำแนะนำในการติดตั้งใช้งานจริงได้ที่การกำหนดค่าตัวอย่าง ที่ให้ไว้สำหรับโปรแกรมจำลองซึ่งอยู่ที่ device/generic/car/emulator/audio/car_audio_fade_configuration.xml

ไฟล์ XML การกำหนดค่าระบบเสียงของรถ

Android 15 เปิดตัวไฟล์ car_audio_configuration.xml ที่อัปเดตแล้ว ซึ่งตอนนี้เป็นเวอร์ชัน 4 และมีแท็ก applyFadeConfigs และ fadeConfig ใหม่ แท็ก applyFadeConfigs สามารถมีคำจำกัดความ fadeConfig หลายรายการ ซึ่งช่วยให้กำหนดค่าการจางได้อย่างยืดหยุ่น คำจำกัดความของแต่ละรายการ

  • ต้องมี fadeConfig เริ่มต้นอย่างน้อย 1 รายการที่กำหนดด้วย isDefault = true
  • สามารถรวมคำจำกัดความ fadeConfig ชั่วคราวได้หลายรายการ การกำหนดค่าชั่วคราวเหล่านี้จะมีผลเฉพาะในระหว่างการโต้ตอบที่สูญเสียโฟกัสเสียง และเฉพาะเมื่อแอปที่ได้รับโฟกัสเสียงตรงกับเกณฑ์ที่กำหนด ในการกำหนดค่าชั่วคราว

โปรดดูคำแนะนำในการติดตั้งใช้งานจริงได้ที่การกำหนดค่าตัวอย่าง ที่ให้ไว้สำหรับโปรแกรมจำลองซึ่งอยู่ที่ device/generic/car/emulator/audio/car_audio_configuration.xml

ส่วนขยายบริการโฟกัสเสียงของ OEM

OEM ที่ใช้บริการโฟกัสเสียงในรถยนต์ที่กำหนดเองจะมีความยืดหยุ่นในการ กำหนดค่าการตั้งค่าการเฟดเสียงโดยรวมไว้ใน OemCarAudioFocusResult ซึ่งทำได้โดยใช้ setAudioAttributesToCarAudioFadeConfigurationMap()เมธอด Builder ดังนี้

/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
        Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}

ที่สำคัญคือ OEM สามารถเลือกใช้การตั้งค่าการจางที่เวลาบูตที่กำหนดค่าไว้ล่วงหน้าหรือใช้การกำหนดค่าแบบไดนามิกผ่านบริการโฟกัสเสียงที่กำหนดเอง ซึ่งช่วยให้ควบคุมได้แบบปรับเปลี่ยนได้

แผนภาพลำดับ

แผนภาพลำดับนี้แสดงลักษณะการทำงานหลังจากที่ App2 ได้รับการให้โฟกัสเสียงและ App1 สูญเสียโฟกัสเสียงในภายหลัง

  • เมื่อบริการเสียงในรถยนต์ส่งการสูญเสียโฟกัสเสียงไปยัง App1 การเล่นจากเพลเยอร์ App1 จะค่อยๆ จางหายไปตามที่กำหนดโดย FadeManagerConfiguration ที่ใช้งานอยู่ เมื่อการจางออกเสร็จสมบูรณ์ App1 จะได้รับการเรียกกลับการสูญเสียโฟกัสเสียงมาตรฐาน
  • ไม่บังคับ: คุณสามารถค่อยๆ เพิ่มเสียงสำหรับ App1 กลับมาหลังจากระยะเวลาที่กำหนดค่าได้ OEM มีความยืดหยุ่นในการกำหนดระยะเวลานี้ผ่าน Builder#setFadeInDurationForUsage(int, long) ตามข้อกำหนดเฉพาะของผลิตภัณฑ์

แผนภาพลำดับสำหรับฟีเจอร์การค่อยๆ เบาลงของเสียงในรถ

รูปที่ 4 แผนภาพลำดับสำหรับฟีเจอร์การค่อยๆ เบาลงของเสียงในรถยนต์

การจัดการโฟกัสหลายโซน

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

สำหรับแอปทั้งหมด CarAudioService จะจัดการโฟกัสโดยอัตโนมัติ ระบบจะกำหนดโซนเสียงของคำขอโฟกัส ตาม UserId หรือ UID ที่เชื่อมโยง (ดูรายละเอียดได้ที่การกำหนดเส้นทางเสียงแบบหลายโซน)

ขอเสียงจากหลายโซนพร้อมกัน

หากแอปต้องการเล่นเสียงในหลายโซนพร้อมกัน แอปจะต้องขอ โฟกัสสำหรับแต่ละโซนโดยใส่ AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID ใน แพ็กเกจ

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

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

โฟกัสเสียง HAL

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

HAL จะเป็นผู้กำหนดขั้นสุดท้ายว่าเสียงใดควรได้รับลำดับความสำคัญ ในกรณีนี้ เสียงที่สำคัญต่อความปลอดภัยและเหตุฉุกเฉินควรเล่นต่อไปไม่ว่า HAL จะได้รับโฟกัสเสียงหรือไม่ก็ตาม และควรเล่นต่อไปตามความเหมาะสมแม้ว่า HAL จะสูญเสียโฟกัสเสียงไปแล้วก็ตาม เช่นเดียวกับเสียงใดๆ ที่กฎระเบียบของรัฐบาลกำหนด

HAL ควรปิดเสียงสตรีม Android อย่างเหมาะสมเมื่อเล่นเสียงฉุกเฉินหรือเสียงที่สำคัญต่อความปลอดภัยเพื่อให้ได้ยินเสียงอย่างชัดเจน

AudioControl@2.0

AudioControl HAL เวอร์ชัน 2.0 มี API ใหม่ดังนี้

API วัตถุประสงค์
IAudioControl#registerFocusListener ลงทะเบียนอินสแตนซ์ของ IFocusListener ด้วย HAL ของ AudioControl Listener นี้ช่วยให้ HAL ขอและละทิ้งโฟกัสเสียงได้ HAL มีอินสแตนซ์ ICloseHandle ที่ Android ใช้เพื่อยกเลิกการลงทะเบียน Listener
IAudioControl#onAudioFocusChange แจ้ง HAL เกี่ยวกับการเปลี่ยนแปลงสถานะของคำขอโฟกัสที่ HAL สร้างขึ้น ผ่าน IFocusListener รวมถึงการตอบกลับคำขอโฟกัสเริ่มต้น
IFocusListener#requestAudioFocus คำขอจะมุ่งเน้นในนามของ HAL สำหรับการใช้งานที่ระบุ, รหัสโซน และประเภทการเพิ่มโฟกัส
IFocusListener#abandonAudioFocus ยกเลิกคำขอโฟกัส HAL ที่มีอยู่สำหรับการใช้งานและโซน Id ที่ระบุ

HAL สามารถมีคำขอโฟกัสหลายรายการพร้อมกันได้ แต่จำกัดไว้ที่ 1 คำขอต่อการใช้งานและการจับคู่รหัสโซน Android จะถือว่า HAL เริ่มเล่นเสียงสำหรับการใช้งานทันที เมื่อมีการส่งคำขอและจะดำเนินการต่อไป จนกว่าจะละทิ้งโฟกัส

นอกเหนือจาก registerFocusListener แล้ว คำขอเหล่านี้ยังoneway เพื่อให้มั่นใจว่า Android จะไม่หน่วงเวลา HAL ขณะประมวลผลคำขอโฟกัส HAL ไม่ควรรอให้ได้โฟกัสก่อนจึงจะเล่นเสียงที่มีความสำคัญต่อความปลอดภัย HAL จะเลือกฟังและตอบสนองต่อการเปลี่ยนแปลงโฟกัสเสียงผ่าน IAudioControl#onAudioFocusChange หรือไม่ก็ได้

บริการโฟกัสเสียงในรถยนต์ของ OEM

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

  • หากไม่มีการโฟกัสเสียงที่มีลำดับความสำคัญสูง (รวมถึงการโทร การแจ้งเตือนเหตุฉุกเฉิน หรือการแจ้งเตือนด้านความปลอดภัย) แอปควรจะได้รับโฟกัสเสียง ไม่ว่าจะชั่วคราวหรือถาวร

  • ขณะที่โฟกัสสื่อทำงานอยู่

    • แอปที่ขอโฟกัสการใช้งานการโทรควรรับสายได้พร้อมกันหรือรับสายได้เพียงอย่างเดียว

    • แอปที่ขอโฟกัสการใช้งานการนำทางควรรับโฟกัสการนำทาง ได้พร้อมกันหรือแยกกัน

    • แอปที่ขอโฟกัสการใช้งาน Assistant ควรรับโฟกัสการใช้งานได้ พร้อมกันหรือแยกกัน

  • ขณะที่แอปที่เน้นเสียงที่มีลำดับความสำคัญสูง (รวมถึงการโทร การแจ้งเตือนเหตุฉุกเฉิน หรือการแจ้งเตือนด้านความปลอดภัย) ทำงานอยู่ ระบบควรให้สิทธิ์หรือเลื่อนคำขอโฟกัสเสียงที่เข้ามา ซึ่งล่าช้าตามความจำเป็น

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