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

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

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

เน้นการโต้ตอบ

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

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

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

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

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

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

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

    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
    

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

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

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

การควบคุมเสียง@2.0

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

API วัตถุประสงค์
IAudioControl#registerFocusListener ลงทะเบียนอินสแตนซ์ของ IFocusListener ด้วยเมธอด AudioControl HAL Listener นี้เปิดใช้ HAL เพื่อขอและยกเลิกเสียง โฟกัส HAl มีอินสแตนซ์ ICloseHandle ที่จะนำไปใช้โดย Android เพื่อยกเลิกการลงทะเบียน Listener
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 จัดการคำขอโฟกัสที่เสียงรถยนต์สกัดกั้นได้ service. ซึ่งช่วยให้ OEM มีความยืดหยุ่นมากขึ้นในการจัดการจุดมุ่งเน้นตามที่จำเป็น ตามกฎเกณฑ์และข้อบังคับ ดังนั้น การโต้ตอบของการโฟกัสเสียงอาจแตกต่างกันระหว่าง จากภูมิภาคหนึ่งไปอีกภูมิภาคหนึ่ง หลักการพื้นฐานสำหรับการโฟกัสเสียง ยังระงับอยู่ แอปควรขอโฟกัสเพื่อให้จัดการเสียงได้ดีขึ้น เพื่อปรับปรุงประสบการณ์ของผู้ใช้ โดยทั่วไป กฎบางข้อยังคงมีผลกับเสียง คำขอโฟกัสตามแอป:

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

  • ขณะโฟกัสสื่ออยู่ ให้ทำดังนี้

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

    • แอปที่ขอโฟกัสการใช้การนำทางควรสามารถรับการนำทางได้ มุ่งเน้นพร้อมๆ กันหรือเฉพาะตัวก็ได้

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

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

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