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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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