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