ก่อนที่จะเริ่มสตรีมเชิงตรรกะ แอปจะขอโฟกัสเสียงโดยใช้แอตทริบิวต์เสียงเดียวกับที่ใช้สำหรับสตรีมเชิงตรรกะ แอปต้องคำนึงถึงการสูญเสียโฟกัสเพื่อให้ทำงานได้ตามที่คาดไว้ใน 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
ของผู้ถือโฟกัสปัจจุบัน และแต่ละคอลัมน์แสดงคำขอขาเข้า
ตัวอย่างเช่น เมื่อแอปสื่อเพลงมีโฟกัสอยู่ขณะที่แอปนำทางขอโฟกัส ตารางเมทริกซ์จะระบุว่าการโต้ตอบ 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
)
ขอโฟกัสที่เลื่อนเวลาได้
วิธีสร้างคำขอที่เลื่อนเวลาได้
ใช้
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
เมื่อส่งคำขอ ให้จัดการกับการตอบกลับ
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; }
เมื่อคําขอล่าช้า โปรแกรมฟังโฟกัสจะจัดการการเปลี่ยนแปลงโฟกัสดังนี้
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 อย่างสม่ำเสมอตามความเหมาะสมเมื่อเล่นเสียงฉุกเฉินหรือเสียงที่มีความสำคัญต่อความปลอดภัย เพื่อให้ได้ยินเสียงดังกล่าวอย่างชัดเจน
AudioControl@2.0
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 ควรได้รับโฟกัสการใช้งานพร้อมกันหรือแบบพิเศษ
ขณะที่แอปโฟกัสเสียงที่มีลำดับความสำคัญสูง (รวมถึงการโทร ข้อความแจ้งเตือนเหตุฉุกเฉิน หรือการแจ้งเตือนความปลอดภัย) ทำงานอยู่ ระบบควรอนุมัติหรือเลื่อนคําขอโฟกัสเสียงที่เลื่อนเวลาไว้ซึ่งเข้ามาใหม่ตามต้องการ
แม้ว่าคำแนะนำข้างต้นจะไม่ใช่คำแนะนำทั้งหมด แต่ก็สามารถช่วยให้แอปที่ขอโฟกัสได้รับโฟกัสได้หากไม่มีเสียงที่มีลำดับความสำคัญสูงที่ใช้งานอยู่ แม้ว่าเสียงที่มีลำดับความสำคัญสูงจะทำงานอยู่ แต่คำขอโฟกัสที่เลื่อนเวลาไว้ก็ยังคงมีผลอยู่และควรได้รับโฟกัสเมื่อเสียงที่มีลำดับความสำคัญสูงหยุดลง