Sebelum memulai aliran logis, aplikasi meminta fokus audio menggunakan atribut audio yang sama seperti yang digunakan untuk aliran logis. Aplikasi harus memperhitungkan kehilangan fokus agar berfungsi seperti yang diharapkan dalam kasus penggunaan otomotif.
Meskipun mengirimkan permintaan fokus disarankan, hal ini tidak diterapkan oleh sistem. Oleh karena itu, pertimbangkan fokus sebagai sarana untuk mengontrol secara tidak langsung dan menghindari konflik selama pemutaran, bukan sebagai mekanisme kontrol audio utama. Kendaraan tidak boleh bergantung pada sistem fokus untuk pengoperasian subsistem audio.
Interaksi fokus
Untuk mendukung AAOS, permintaan fokus audio ditangani berdasarkan interaksi yang telah ditentukan antara CarAudioContext
permintaan dan pemegang fokus saat ini. Ada tiga jenis interaksi:
- Eksklusif
- Menolak
- Bersamaan
Interaksi eksklusif
Ini adalah model interaksi yang paling umum digunakan dengan Android.
Dalam interaksi eksklusif , hanya satu aplikasi yang diperbolehkan untuk mempertahankan fokus dalam satu waktu. Oleh karena itu, permintaan fokus yang masuk diberikan fokus sementara pemegang fokus yang ada kehilangan fokus. Karena kedua aplikasi memutar media, hanya satu aplikasi yang diperbolehkan untuk mempertahankan fokus. Hasilnya, permintaan fokus aplikasi yang baru dimulai dikembalikan dengan AUDIOFOCUS_REQUEST_GRANTED
sementara aplikasi yang sedang memutar musik menerima peristiwa perubahan fokus dengan status kehilangan yang sesuai dengan jenis permintaan yang dibuat.
Tolak interaksi
Dengan interaksi penolakan , permintaan masuk selalu ditolak. Misalnya, saat mencoba memutar musik saat panggilan sedang berlangsung. Dalam hal ini, jika Dialer menahan fokus audio untuk panggilan dan aplikasi kedua meminta fokus untuk memutar musik, aplikasi musik akan menerima AUDIOFOCUS_REQUEST_FAILED
sebagai respons terhadap permintaan tersebut. Karena permintaan fokus ditolak, tidak ada kehilangan fokus yang dikirimkan ke pemegang fokus saat ini.
Interaksi serentak
Yang unik dari AAOS adalah interaksi bersamaan . Hal ini memberikan aplikasi yang meminta fokus audio di dalam mobil kemampuan untuk mempertahankan fokus secara bersamaan dengan aplikasi lain. Agar interaksi secara bersamaan dapat terjadi, kondisi berikut harus dipenuhi. Itu:
Permintaan fokus yang masuk harus meminta AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
Pemegang fokus saat ini tidak menyetelPauseWhenDucked(true)
Pemegang fokus saat ini memilih untuk tidak menerima acara bebek
Jika kriteria ini terpenuhi, maka permintaan fokus akan dikembalikan dengan AUDIOFOCUS_REQUEST_GRANTED
sementara pemegang fokus saat ini tidak mengalami perubahan fokus. Namun, jika pemegang fokus saat ini memilih untuk menerima peristiwa yang dirahasiakan atau menjeda saat peristiwa tersebut dihindarkan, pemegang fokus saat ini akan kehilangan fokus, seperti yang terjadi pada interaksi eksklusif.
Menangani aliran bersamaan
Meskipun interaksi serentak memiliki banyak kegunaan, berhati-hatilah dalam mencampur dan menghindari tingkat perangkat keras di seluruh perangkat keluaran. Kami sangat menyarankan CarAudioContext
yang diizinkan untuk diputar secara bersamaan harus dirutekan ke perangkat keluaran yang berbeda.
Dengan memiliki perangkat output terpisah untuk aliran bersamaan, hal ini memungkinkan HAL untuk menghindari salah satu aliran sebelum mencampurnya, atau mengarahkan aliran fisik ke speaker berbeda di dalam kendaraan. Jika aliran logis digabungkan dalam Android, perolehan tidak akan berubah dan dikirimkan sebagai bagian dari aliran fisik yang sama.
Misalnya, ketika navigasi dan media dikirimkan secara bersamaan, penguatan aliran media untuk sementara dapat dikurangi (atau, dikurangi) sehingga instruksi navigasi dapat didengar dengan lebih jelas. Sebagai alternatif, aliran navigasi dapat dialihkan ke speaker sisi pengemudi sementara media terus diputar di seluruh kabin.
Matriks interaksi
Tabel di bawah menunjukkan matriks interaksi seperti yang ditentukan oleh CarAudioService
. Setiap baris mewakili CarAudioContext
pemegang fokus saat ini dan setiap kolom mewakili permintaan masuk.
Misalnya, saat aplikasi media musik mempertahankan fokus saat aplikasi navigasi meminta fokus, matriks menunjukkan bahwa kedua interaksi dapat diputar secara bersamaan, dengan asumsi kriteria lain untuk interaksi bersamaan terpenuhi.
Karena interaksi yang terjadi secara bersamaan, pemegang fokus dapat memiliki lebih dari satu orang. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan masing-masing pemegang fokus saat ini sebelum menentukan interaksi apa yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatiflah yang menang. Tolak, lalu eksklusif, dan akhirnya bersamaan.
Gambar 1. Matriks interaksi fokus audio.
Navigasi selama panggilan telepon
Di Android 11, setelan pengguna baru diperkenalkan untuk memungkinkan pengguna mengubah perilaku interaksi antara navigasi dan panggilan telepon. Jika disetel, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
mengubah interaksi antara permintaan fokus NAVIGATION
yang masuk dan pemegang fokus CALL
saat ini dari serentak menjadi rejects . Jika pengguna lebih memilih agar petunjuk navigasi tidak mengganggu panggilan, mereka dapat mengaktifkan pengaturan tersebut. Hal ini dipertahankan untuk pengguna, dan dapat diatur secara dinamis sehingga permintaan fokus berikutnya mengikuti pengaturan baru.
Fokus audio yang tertunda
Di Android 11, AAOS menambahkan dukungan untuk meminta fokus audio yang dapat ditunda . Hal ini memungkinkan permintaan fokus non-sementara ditunda ketika interaksinya dengan pemegang fokus saat ini biasanya mengakibatkan permintaan tersebut ditolak. Setelah perubahan fokus menghasilkan keadaan di mana permintaan yang tertunda bisa mendapatkan fokus, permintaan tersebut dikabulkan.
Aturan untuk permintaan fokus audio tertunda
Hanya permintaan non-sementara. Permintaan tertunda hanya dapat dibuat untuk sumber non-sementara agar suara sementara tidak diputar lama setelah relevan.
Hanya satu permintaan yang dapat ditunda dalam satu waktu. Jika permintaan yang dapat ditunda dibuat saat sudah ada permintaan yang tertunda, permintaan tertunda asli akan menerima peristiwa perubahan
AUDIOFOCUS_LOSS
dan permintaan baru akan menerima respons sinkron sebesarAUDIOFOCUS_REQUEST_DELAYED
.Permintaan yang dapat ditunda harus memiliki
OnAudioFocusChangeListener
Setelah permintaan ditunda, pendengar digunakan untuk memberi tahu pemohon ketika permintaan akhirnya dikabulkan (AUDIOFOCUS_GAIN
), atau jika kemudian ditolak (AUDIOFOCUS_LOSS
).
Minta fokus yang dapat ditunda
Untuk membuat permintaan yang dapat ditunda:
Gunakan
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
Saat membuat permintaan, tangani respons
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; }
Ketika permintaan tertunda, pemroses fokus menangani perubahan fokus:
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
Manajemen fokus multi-zona
Untuk kendaraan dengan beberapa zona audio, fokus audio dikelola secara independen untuk setiap zona. Dengan demikian, permintaan ke satu zona tidak memperhitungkan apa yang menjadi fokus di zona lain, juga tidak menyebabkan pemegang fokus di zona lain kehilangan fokus. Dengan ini, fokus kabin utama dapat diatur secara terpisah dari sistem hiburan kursi belakang, sehingga tidak mengganggu pemutaran audio di satu zona dengan perubahan fokus ke zona lainnya.
Untuk semua aplikasi, CarAudioService
secara otomatis mengelola fokus. Zona audio permintaan fokus ditentukan oleh UserId
atau UID
yang terkait (untuk detailnya, lihat Perutean Audio ).
Minta audio dari beberapa zona secara bersamaan
Jika aplikasi ingin memutar audio di beberapa zona secara bersamaan, aplikasi harus meminta fokus untuk setiap zona dengan menyertakan AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
dalam paket:
//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
Parameter bundel ini memungkinkan pemohon untuk mengganti pemetaan zona audio otomatis untuk menggunakan ID zona yang ditentukan. Oleh karena itu, aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio berbeda.
Fokus audio HAL
Mulai Android 11, HAL diaktifkan untuk meminta fokus atas nama aliran eksternal. Meskipun bersifat opsional, penggunaan API ini sangat dianjurkan agar suara eksternal dapat menjadi peserta yang optimal dalam ekosistem Android dan memberikan pengalaman pengguna yang lancar.
HAL membuat keputusan akhir mengenai suara mana yang harus mendapat prioritas. Sejauh ini, suara darurat dan keselamatan harus diputar terlepas dari apakah HAL diberikan fokus audio atau tidak dan harus terus diputar sebagaimana mestinya meskipun HAL kehilangan fokus audio. Hal yang sama berlaku untuk semua suara yang diwajibkan oleh peraturan pemerintah.
HAL harus secara proaktif menonaktifkan streaming Android jika diperlukan saat memutar suara darurat atau penting bagi keselamatan untuk memastikannya terdengar jelas.
AudioKontrol@2.0
AudioControl HAL versi 2.0 memperkenalkan API baru berikut:
API | Tujuan |
---|---|
IAudioControl#registerFocusListener | Mendaftarkan instance IFocusListener dengan AudioControl HAL. Pendengar ini memungkinkan HAL untuk meminta dan mengabaikan fokus audio. HAl menyediakan instance ICloseHandle yang akan digunakan oleh Android untuk membatalkan pendaftaran pendengar. |
IAudioControl#onAudioFocusChange | Memberi tahu HAL tentang perubahan status permintaan fokus yang dibuat oleh HAL melalui IFocusListener , termasuk respons terhadap permintaan fokus awal. |
IFocusListener#requestAudioFocus | Permintaan fokus atas nama HAL untuk penggunaan tertentu, Id zona, dan jenis perolehan fokus. |
IFocusListener#abandonAudioFocus | Abaikan permintaan fokus HAL yang ada untuk penggunaan dan Id zona tertentu. |
HAL dapat memiliki beberapa permintaan fokus pada saat yang sama, namun terbatas pada satu permintaan per penggunaan dan pemasangan ID zona. Android mengasumsikan HAL segera mulai memutar suara untuk suatu penggunaan setelah permintaan dibuat dan terus melakukannya hingga kehilangan fokus.
Selain registerFocusListener
, permintaan ini merupakan oneway
untuk memastikan bahwa Android tidak menunda HAL saat permintaan fokus diproses. HAL tidak perlu menunggu untuk mendapatkan fokus sebelum memainkan suara-suara yang penting bagi keselamatan. HAL bersifat opsional untuk mendengarkan dan merespons perubahan fokus audio melalui IAudioControl#onAudioFocusChange
.
Layanan fokus audio mobil OEM
Di Android 14, AAOS memperkenalkan layanan plugin OEM mobil untuk mengaktifkan kemampuan konfigurasi pada beberapa komponen mobil. Untuk Layanan Plugin Audio Mobil , layanan plugin memungkinkan OEM mengelola permintaan fokus yang disadap oleh layanan audio mobil. Hal ini memberi OEM lebih banyak fleksibilitas dalam hal mengelola fokus seperti yang disyaratkan oleh peraturan dan regulasi. Oleh karena itu, interaksi fokus audio mungkin berbeda antar produsen, dan dari satu wilayah ke wilayah lainnya. Premis dasar untuk fokus audio masih berlaku, bahwa aplikasi tetap harus meminta fokus untuk pengelolaan audio yang lebih baik guna meningkatkan pengalaman pengguna. Secara umum, aturan tertentu masih berlaku untuk permintaan fokus audio oleh aplikasi:
Tanpa berdiri apa pun, aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau pemberitahuan keselamatan) seharusnya bisa mendapatkan fokus audio baik secara sementara atau permanen.
Saat fokus media aktif:
Aplikasi yang meminta fokus penggunaan panggilan harus dapat menerima panggilan secara bersamaan atau eksklusif.
Aplikasi yang meminta fokus penggunaan navigasi harus dapat menerima fokus navigasi secara bersamaan atau eksklusif.
Aplikasi yang meminta fokus penggunaan asisten harus dapat menerima fokus penggunaan baik secara bersamaan atau eksklusif.
Saat aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau pemberitahuan keselamatan) aktif, permintaan fokus audio tertunda apa pun yang masuk harus dikabulkan atau ditunda sesuai kebutuhan.
Meskipun saran di atas tidak menyeluruh, namun dapat membantu aplikasi yang meminta fokus untuk mendapatkan fokus jika tidak ada suara aktif berprioritas tinggi. Meskipun suara berprioritas tinggi aktif, permintaan fokus tertunda tetap harus dipenuhi dan harus dapat memperoleh fokus ketika suara berprioritas tinggi berhenti.