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

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

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

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

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

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

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

รูปแบบการโต้ตอบนี้เป็นรูปแบบที่ใช้กับ Android มากที่สุด

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

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

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

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

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

  • คำขอโฟกัสขาเข้าต้องขอ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. เมื่อคําขอล่าช้า โปรแกรมฟังโฟกัสจะจัดการการเปลี่ยนแปลงโฟกัสดังนี้

    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: เราได้เปิดตัว Flag ใหม่สำหรับฟีเจอร์การวางซ้อนทรัพยากรรันไทม์ (RRO) audioUseFadeManagerConfiguration เพื่อเปิดหรือปิดใช้ฟีเจอร์นี้

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

การกําหนดค่าเครื่องมือจัดการการเลือน

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

การกําหนดค่าเครื่องมือจัดการการเลือน

รูปที่ 3 การกําหนดค่าเครื่องมือจัดการการเลือน

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

  • คุณสมบัติการเปลี่ยนแบบจางลง: การตั้งค่าทั้งการจางออกและการจางเข้า
    • กําหนดได้ด้วยการใช้เสียงหรือแอตทริบิวต์เสียงที่เฉพาะเจาะจง
    • อนุญาตให้ตั้งค่าระยะเวลาเอง
    • การตั้งค่าเหล่านี้ใช้ในการสร้าง 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()

/** @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 อย่างสม่ำเสมอตามความเหมาะสมเมื่อเล่นเสียงฉุกเฉินหรือเสียงที่มีความสำคัญต่อความปลอดภัย เพื่อให้ได้ยินเสียงดังกล่าวอย่างชัดเจน

[email protected]

AudioControl HAL เวอร์ชัน 2.0 เปิดตัว API ใหม่ต่อไปนี้

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

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

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

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

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

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

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

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

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

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

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

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