Sebelum memulai aliran logis, aplikasi meminta fokus audio menggunakan atribut audio yang sama seperti yang digunakan untuk aliran logis. Aplikasi harus menghormati hilangnya fokus agar dapat berfungsi seperti yang diharapkan dalam kasus penggunaan otomotif.
Meskipun mengirim permintaan fokus direkomendasikan, hal ini tidak diterapkan oleh sistem. Oleh karena itu, pertimbangkan fokus sebagai cara untuk mengontrol dan menghindari konflik secara tidak langsung 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 sebelumnya antara CarAudioContext
permintaan dan pemegang
fokus saat ini. Ada tiga jenis interaksi:
- Eksklusif
- Tolak
- Concurrent
Interaksi eksklusif
Ini adalah model interaksi yang paling umum digunakan dengan Android.
Dalam interaksi eksklusif, hanya satu aplikasi yang diizinkan untuk mempertahankan fokus pada satu waktu.
Oleh karena itu, permintaan fokus yang masuk akan diberi fokus sementara pemegang fokus
yang ada akan kehilangan fokus. Karena kedua aplikasi memutar media, hanya satu aplikasi yang diizinkan untuk mempertahankan
fokus. Akibatnya, permintaan fokus aplikasi yang baru dimulai ditampilkan dengan
AUDIOFOCUS_REQUEST_GRANTED
, sementara aplikasi musik yang sedang diputar menerima
peristiwa perubahan fokus dengan status kehilangan yang sesuai dengan jenis permintaan
yang dibuat.
Menolak interaksi
Dengan interaksi reject, permintaan masuk selalu ditolak. Misalnya, saat mencoba memutar musik saat panggilan sedang berlangsung. Dalam hal ini, jika Dialer memegang 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 dikirim
ke pemegang fokus saat ini.
Interaksi serentak
Interaksi serentak adalah fitur unik untuk AAOS. Hal ini memberi aplikasi yang meminta fokus audio di mobil kemampuan untuk mempertahankan fokus secara bersamaan dengan aplikasi lain. Agar interaksi serentak dapat terjadi, kondisi berikut harus dipenuhi. The:
Permintaan fokus masuk harus meminta AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
Pemegang fokus saat ini tidak setPauseWhenDucked(true)
Pemegang fokus saat ini memilih untuk tidak menerima peristiwa pengecilan volume
Jika kriteria ini terpenuhi, permintaan fokus akan ditampilkan dengan
AUDIOFOCUS_REQUEST_GRANTED
, sementara pemegang fokus saat ini tidak mengalami perubahan
fokus. Namun, jika pemegang fokus saat ini memilih untuk menerima peristiwa merunduk atau menjeda saat merunduk, pemegang fokus saat ini akan kehilangan fokus, seperti yang terjadi pada interaksi eksklusif.
Menangani streaming serentak
Meskipun interaksi serentak memiliki banyak kegunaan, berhati-hatilah saat mencampur dan
meredam pada tingkat hardware di seluruh perangkat output. Sebaiknya instance CarAudioContext
yang diizinkan untuk diputar secara bersamaan dialihkan ke perangkat output yang berbeda.
Dengan memiliki perangkat output terpisah untuk streaming serentak, HAL dapat meredam salah satu streaming sebelum mencampurnya, atau merutekan streaming fisik ke speaker yang berbeda di kendaraan. Jika aliran logis dicampur dalam Android, perolehan tidak akan berubah dan dikirimkan sebagai bagian dari aliran fisik yang sama.
Misalnya, saat navigasi dan media dikirimkan secara bersamaan, perolehan untuk aliran media dapat dikurangi (atau, diredam) untuk sementara agar petunjuk navigasi dapat terdengar lebih jelas. Atau, aliran navigasi dapat diarahkan ke speaker sisi pengemudi, sementara media terus diputar di seluruh kabin.
Matriks interaksi
Tabel ini menunjukkan matriks interaksi sebagaimana ditentukan oleh CarAudioService
.
Setiap baris mewakili CarAudioContext
pemegang fokus saat ini dan setiap kolom mewakili permintaan yang 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 serentak terpenuhi.
Karena interaksi serentak, ada kemungkinan ada lebih dari satu pemegang fokus. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan setiap pemegang fokus saat ini sebelum menentukan interaksi yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatif akan menang. Tolak, lalu eksklusif, dan terakhir serentak.
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 bersamaan menjadi ditolak. Jika pengguna lebih memilih agar petunjuk navigasi tidak mengganggu panggilan, mereka dapat mengaktifkan setelan ini. Setelan ini
dipertahankan untuk pengguna, dan dapat ditetapkan secara dinamis sehingga permintaan
fokus berikutnya mematuhi setelan baru.
Fokus audio yang dapat ditunda
Di Android 11, AAOS menambahkan dukungan untuk meminta fokus audio dapat ditunda. Hal ini memungkinkan permintaan fokus non-sementara ditunda saat interaksinya dengan pemegang fokus saat ini biasanya akan menyebabkan permintaan tersebut ditolak. Setelah perubahan fokus menghasilkan status saat permintaan tertunda dapat memperoleh fokus, permintaan akan diberikan.
Aturan untuk permintaan fokus audio yang tertunda
Hanya permintaan non-transien. Permintaan tertunda hanya dapat dilakukan untuk sumber yang tidak sementara untuk menghindari pemutaran suara sementara dalam waktu lama setelah relevan.
Hanya satu permintaan yang dapat ditunda dalam satu waktu. Jika permintaan yang dapat ditunda dibuat saat sudah ada permintaan yang ditunda, permintaan yang ditunda sebelumnya akan menerima peristiwa perubahan
AUDIOFOCUS_LOSS
dan permintaan baru akan menerima respons sinkronAUDIOFOCUS_REQUEST_DELAYED
.Permintaan yang dapat ditunda harus memiliki
OnAudioFocusChangeListener
. Setelah permintaan ditunda, pemroses digunakan untuk memberi tahu pemohon saat permintaan akhirnya diberikan (AUDIOFOCUS_GAIN
), atau jika ditolak nanti (AUDIOFOCUS_LOSS
).
Meminta 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; }
Saat 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
Pudar yang diterapkan sistem
Android 15 memperkenalkan fade audio yang diterapkan sistem di AAOS. Di Android, fokus audio tidak diterapkan oleh sistem. Jadi, meskipun developer aplikasi dianjurkan untuk mematuhi panduan fokus audio, jika aplikasi terus memutar audio dengan keras bahkan setelah kehilangan fokus audio, sistem tidak dapat mencegahnya.
Dalam lingkungan otomotif yang penting untuk keselamatan, kepatuhan terhadap fokus audio sangat penting untuk meminimalkan gangguan pengemudi. Dengan fitur ini, framework audio kini secara otomatis memudarkan aplikasi yang kehilangan fokus audio, untuk pengalaman audio yang lebih terkontrol dan dapat diprediksi.
Peningkatan ini membantu memastikan bahwa aplikasi mematuhi keputusan kehilangan fokus audio seperti yang ditentukan oleh matriks interaksi, sehingga mencegah konflik pemutaran audio.
Desain tingkat tinggi
Gambar berikut menunjukkan desain tingkat tinggi dan dukungan untuk fitur kehilangan fokus di mobil:
Gambar 2. Desain tingkat tinggi untuk fitur pudar yang diterapkan sistem.
- Peredupan yang ditargetkan: Penerapan peredupan oleh sistem di Android 15 dirancang khusus untuk situasi saat aplikasi kehilangan fokus audio, tetapi terus memutar audio.
- Mekanisme fade-out: Saat aplikasi kehilangan fokus audio karena permintaan
aplikasi baru:
- Framework audio secara otomatis memudarkan audio aplikasi yang kalah.
- Setelah fade-out, aliran audio akan disenyapkan oleh sistem.
- Aplikasi kemudian menerima notifikasi hilangnya fokus audio.
- Aplikasi yang berperilaku tidak semestinya akan dibisukan hingga mendapatkan kembali fokus audio.
- Logika defaultnya adalah memunculkan aplikasi yang memudar setelah 2 detik. Namun, OEM dapat mengonfigurasi ini ke nilai waktu tunggu apa pun.
- Framework audio menggunakan konfigurasi OEM untuk operasi fade-out dan fade-in.
File konfigurasi OEM: Android 15 menyertakan file konfigurasi baru,
car_audio_fade_configuration.xml
:- File ini memungkinkan OEM menentukan kriteria kapan penerapan fokus audio sistem diterapkan ke aplikasi yang kehilangan fokus.
- Framework audio menerapkan fade-out dan peredaman suara hanya jika aplikasi yang kalah cocok dengan aturan yang ditentukan OEM dalam file XML ini.
- Hal ini memberikan mekanisme bagi OEM untuk menyesuaikan perilaku fitur berdasarkan karakteristik aplikasi atau jenis penggunaan audio.
Kontrol fitur dengan RRO: Flag fitur overlay resource runtime (RRO) baru,
audioUseFadeManagerConfiguration
, telah diperkenalkan untuk mengaktifkan atau menonaktifkan fitur ini:- Fitur ini dinonaktifkan secara default.
- Untuk mengaktifkan kehilangan fokus audio yang diterapkan sistem, OEM harus
menetapkan tanda ini ke
true
. - Meskipun framework audio mobil mengharapkan definisi konfigurasi fade yang valid saat tanda diaktifkan, tidak adanya definisi tersebut tidak otomatis menyebabkan pengecualian fatal.
- Semua aplikasi konfigurasi pudar harus memiliki definisi pudar yang cocok. Memanggil konfigurasi pudar (berdasarkan namanya) sebagai bagian dari konfigurasi audio mobil tanpa memberikan definisi yang valid adalah error fatal.
- Jika tanda dinonaktifkan, semua definisi konfigurasi pudar dan referensi konfigurasi akan diabaikan.
Konfigurasi pengelola pudar
Framework audio Android 15 memperkenalkan FadeManagerConfiguration
terpadu untuk memberikan kontrol terperinci kepada OEM atas perilaku memudar audio. Framework ini diilustrasikan dalam Gambar 3:
Gambar 3. Konfigurasi pengelola pudar.
Konfigurasi ini mencakup:
- Properti transisi pudar: Setelan untuk pudar keluar dan pudar masuk.
- Dapat ditentukan dengan penggunaan atau atribut audio tertentu.
- Memungkinkan setelan durasi kustom.
- Setelan ini digunakan untuk membuat
VolumeShaper.Configuration
.
- Kebijakan memudar: Aturan yang mengatur kapan pemudaran terjadi.
- Tombol global untuk mengaktifkan atau menonaktifkan pemudaran.
- Daftar penggunaan audio yang dapat dikonfigurasi dan dapat di-fade out (memenuhi syarat untuk di-fade out saat kehilangan fokus).
- Daftar pengecualian (tidak dapat di-fade) mencegah sumber audio penting atau yang ditetapkan di-fade. Daftar ini dapat didasarkan pada:
- Jenis konten
- Atribut audio
- UID Aplikasi (hanya dapat disetel selama runtime)
Konfigurasi OEM
Di bagian ini, kita akan melihat penyesuaian OEM yang tersedia.
File XML konfigurasi fade audio mobil
Android 15 memperkenalkan file konfigurasi baru, car_audio_fade_configuration.xml
, yang memungkinkan penyesuaian OEM yang ekstensif terhadap perilaku fade-out audio saat fokus hilang.
- File XML ini memungkinkan definisi beberapa konfigurasi pudar yang berbeda, yang masing-masing memerlukan nama unik untuk referensi silang dalam
car_audio_configuration.xml
. - Konfigurasi ini dapat diterapkan secara fleksibel di berbagai zona audio dan konfigurasi zona.
- Khususnya, setiap konfigurasi pudar hanya menerima nilai durasi dalam
milidetik, yang kemudian digunakan sistem untuk menghasilkan
VolumeShaper.Configuration
yang sesuai secara internal.
Untuk panduan penerapan praktis, lihat contoh konfigurasi yang disediakan untuk emulator yang terletak di device/generic/car/emulator/audio/car_audio_fade_configuration.xml
.
File XML konfigurasi audio mobil
Android 15 memperkenalkan file car_audio_configuration.xml
yang telah diupdate, kini di
versi 4, yang menggabungkan tag applyFadeConfigs
dan fadeConfig
baru.
Tag applyFadeConfigs
dapat berisi beberapa definisi fadeConfig
,
sehingga memungkinkan konfigurasi pudar yang fleksibel. Setiap definisi:
- Harus menyertakan satu
fadeConfig
default yang ditetapkan denganisDefault = true
. - Dapat mencakup beberapa definisi
fadeConfig
sementara. Konfigurasi sementara ini diterapkan secara khusus selama interaksi kehilangan fokus audio, dan hanya saat aplikasi yang memperoleh fokus audio cocok dengan kriteria yang ditentukan dalam konfigurasi sementara.
Untuk panduan penerapan praktis, lihat contoh konfigurasi yang disediakan untuk emulator yang terletak di device/generic/car/emulator/audio/car_audio_configuration.xml
.
Ekstensi layanan fokus audio OEM
OEM yang menerapkan layanan fokus audio mobil kustom memiliki fleksibilitas untuk
mengonfigurasi setelan fade audio dengan menyertakannya dalam OemCarAudioFocusResult
.
Hal ini dapat dilakukan menggunakan
metode builder setAudioAttributesToCarAudioFadeConfigurationMap()
:
/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}
Khususnya, OEM dapat memilih untuk menggunakan setelan pudar waktu booting yang telah dikonfigurasi sebelumnya atau menerapkan konfigurasi secara dinamis melalui layanan fokus audio kustom mereka, yang menawarkan kontrol yang dapat disesuaikan.
Diagram urutan
Diagram urutan ini menggambarkan perilaku setelah pemberian fokus audio ke App2
dan hilangnya fokus audio berikutnya oleh App1
:
- Setelah layanan audio mobil mengirimkan kehilangan fokus audio ke
App1
, pemutaran dari pemutarApp1
akan mengalami fade-out seperti yang ditentukan olehFadeManagerConfiguration
aktif. Setelah operasi memudar selesai,App1
menerima callback kehilangan fokus audio standar. - Secara opsional, audio untuk
App1
dapat diaktifkan kembali setelah durasi yang dapat dikonfigurasi. OEM memiliki fleksibilitas untuk menetapkan durasi ini melaluiBuilder#setFadeInDurationForUsage(int, long)
sesuai dengan persyaratan produk spesifik mereka.
Gambar 4. Diagram urutan untuk fitur memudarkan audio mobil.
Pengelolaan fokus multi-zona
Untuk kendaraan dengan beberapa zona audio, fokus audio dikelola secara terpisah untuk setiap zona. Dengan demikian, permintaan ke satu zona tidak memperhitungkan apa yang memegang fokus di zona lain, dan tidak menyebabkan pemegang fokus di zona lain kehilangan fokus. Dengan demikian, fokus kabin utama dapat dikelola secara terpisah dari sistem hiburan di kursi belakang, sehingga tidak mengganggu pemutaran audio di satu zona dengan perubahan fokus ke zona lain.
Untuk semua aplikasi, CarAudioService
otomatis mengelola fokus. Zona audio permintaan
fokus ditentukan oleh UserId
atau UID
yang terkait
(untuk mengetahui detailnya, lihat Perutean audio multi-zona).
Meminta audio dari beberapa zona secara serentak
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 paket ini memungkinkan pemohon mengganti pemetaan zona audio otomatis untuk menggunakan ID zona yang ditentukan. Oleh karena itu, aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio yang berbeda.
Fokus audio HAL
Mulai Android 11, HAL diaktifkan untuk meminta fokus atas nama streaming eksternal. Meskipun bersifat opsional, penggunaan API ini sangat dianjurkan untuk memungkinkan suara eksternal menjadi peserta yang optimal dalam ekosistem Android dan untuk memberikan pengalaman pengguna yang lancar.
HAL membuat penentuan akhir terkait suara mana yang harus diprioritaskan. Untuk itu, suara penting terkait keselamatan dan keadaan darurat harus diputar terlepas dari apakah HAL diberi fokus audio atau tidak, dan harus terus diputar sebagaimana mestinya meskipun HAL kehilangan fokus audio. Hal yang sama berlaku untuk suara apa pun yang diwajibkan oleh peraturan pemerintah.
HAL harus secara proaktif membisukan aliran Android sebagaimana mestinya saat memutar suara darurat atau suara penting untuk keselamatan guna memastikan suara tersebut terdengar dengan jelas.
AudioControl@2.0
AudioControl HAL versi 2.0 memperkenalkan API baru berikut:
API | Tujuan |
---|---|
IAudioControl#registerFocusListener |
Mendaftarkan instance IFocusListener dengan
HAL AudioControl. Pemroses ini memungkinkan HAL meminta dan melepaskan fokus audio. HAL menyediakan instance ICloseHandle yang akan digunakan oleh
Android untuk membatalkan pendaftaran pemroses. |
IAudioControl#onAudioFocusChange |
Memberi tahu HAL tentang perubahan status untuk memfokuskan permintaan yang dibuat oleh HAL
melalui IFocusListener , termasuk respons terhadap permintaan
fokus awal. |
IFocusListener#requestAudioFocus |
Permintaan berfokus atas nama HAL untuk penggunaan, ID zona, dan jenis perolehan fokus tertentu. |
IFocusListener#abandonAudioFocus |
Membatalkan permintaan fokus HAL yang ada untuk penggunaan dan zona yang ditentukan Id. |
HAL dapat memiliki beberapa permintaan fokus secara bersamaan, tetapi dibatasi hingga satu permintaan per penggunaan dan pasangan ID zona. Android mengasumsikan HAL segera mulai memutar suara untuk penggunaan setelah permintaan dibuat dan terus melakukannya hingga melepaskan fokus.
Selain registerFocusListener
, permintaan ini adalah oneway
untuk memastikan bahwa
Android tidak menunda HAL saat permintaan fokus diproses. HAL tidak boleh menunggu untuk mendapatkan fokus sebelum memutar suara penting untuk keselamatan. HAL dapat secara opsional memproses 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 untuk beberapa komponen mobil. Untuk Layanan Plugin Audio Mobil, layanan plugin memungkinkan OEM mengelola permintaan fokus yang dicegat oleh layanan audio mobil. Hal ini memberi OEM lebih banyak fleksibilitas dalam hal mengelola fokus sesuai dengan yang diperlukan oleh aturan dan peraturan. Oleh karena itu, interaksi fokus audio dapat berbeda-beda antara produsen, dan dari wilayah ke wilayah. Premis dasar untuk fokus audio tetap 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 fokus audio berprioritas tinggi yang sedang berlangsung (termasuk panggilan telepon, peringatan darurat, atau notifikasi keselamatan), aplikasi harus dapat memperoleh fokus audio baik secara sementara maupun permanen.
Saat fokus media aktif:
Aplikasi yang meminta fokus penggunaan panggilan harus dapat menerima panggilan secara serentak atau eksklusif.
Aplikasi yang meminta fokus penggunaan navigasi harus dapat menerima fokus navigasi secara serentak atau eksklusif.
Aplikasi yang meminta fokus penggunaan asisten harus dapat menerima fokus penggunaan secara serentak atau eksklusif.
Saat aplikasi fokus audio berprioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau notifikasi keselamatan) aktif, setiap permintaan fokus audio tertunda yang masuk harus diberikan atau ditunda sesuai kebutuhan.
Meskipun tidak lengkap, saran ini dapat membantu aplikasi yang meminta fokus untuk mendapatkan fokus jika tidak ada suara prioritas tinggi yang aktif. Meskipun suara berprioritas tinggi aktif, permintaan fokus yang tertunda harus tetap dipatuhi dan harus dapat memperoleh fokus saat suara berprioritas tinggi berhenti.