Input audio biasanya berasal dari mikrofon internal, mikrofon eksternal, atau antarmuka audio yang terpasang ke perangkat. Input audio juga dapat berasal dari percakapan telepon.
Terkadang, dua aplikasi atau lebih mungkin ingin "mengambil" input audio yang sama. Aplikasi mungkin melakukan tugas yang berbeda. Misalnya, beberapa aplikasi yang menerima audio mungkin "merekaman", seperti perekam suara sederhana, sedangkan aplikasi lain mungkin "mendengarkan", seperti Asisten Google atau layanan aksesibilitas yang merespons perintah suara.
Dalam kedua kasus tersebut, aplikasi ini ingin menerima input audio. Di seluruh halaman ini, kami menggunakan istilah "rekam", terlepas dari apakah aplikasi merekam atau hanya mendengarkan.
Jika dua aplikasi atau lebih ingin merekam audio secara bersamaan, mungkin ada masalah dalam mengirimkan sinyal audio dari sumber yang sama ke semua aplikasi. Halaman ini menjelaskan cara sistem Android berbagi input audio di antara beberapa aplikasi yang merekam audio.
Perilaku pra-Android 10
Sebelum Android 10, streaming audio input hanya dapat direkam oleh satu aplikasi
sekaligus. Jika beberapa aplikasi sudah merekam atau mendengarkan audio, aplikasi Anda dapat
membuat objek AudioRecord
, tetapi error akan ditampilkan saat Anda memanggil
AudioRecord.startRecording()
dan perekaman tidak akan dimulai.
Satu pengecualian untuk aturan ini adalah saat aplikasi dengan hak istimewa (seperti Asisten Google atau
layanan aksesibilitas) memiliki izin
android.permission.CAPTURE_AUDIO_HOTWORD
dan menggunakan sumber audio jenis
HOTWORD
. Dalam hal ini aplikasi lain dapat mulai merekam. Jika hal itu terjadi,
aplikasi dengan hak istimewa akan dihentikan dan aplikasi baru akan menangkap input.
Satu perubahan lagi ditambahkan di Android 9: hanya aplikasi yang berjalan di latar depan (atau layanan latar depan) yang dapat merekam input audio. Saat aplikasi tanpa layanan latar depan atau komponen UI latar depan mulai merekam, aplikasi akan terus berjalan tetapi menerima keheningan, meskipun itu satu-satunya aplikasi yang merekam audio pada saat itu.
Perilaku Android 10
Perilaku sebelum Android 10 adalah "siapa cepat dia dapat". Setelah aplikasi mulai merekam audio, tidak ada aplikasi lain yang dapat mengakses input audio hingga aplikasi yang merekam audio berhenti.
Android 10 menerapkan skema prioritas yang dapat mengalihkan streaming audio input di antara aplikasi saat aplikasi tersebut berjalan. Dalam sebagian besar kasus, jika aplikasi baru memperoleh input audio, aplikasi yang sebelumnya merekam akan terus berjalan, tetapi menerima keheningan. Dalam beberapa kasus, sistem dapat terus mengirimkan audio ke kedua aplikasi. Berbagai skenario berbagi dijelaskan di bawah.
Skema ini mirip dengan cara fokus audio menangani beberapa aplikasi yang bersaing untuk menggunakan output audio. Namun, fokus audio dikelola oleh permintaan terprogram untuk mendapatkan dan melepaskan fokus, sedangkan skema pengalihan input yang dijelaskan di sini didasarkan pada kebijakan prioritas yang diterapkan secara otomatis setiap kali aplikasi baru mulai merekam audio.
Untuk keperluan menangkap audio, Android membedakan dua jenis aplikasi:
- Aplikasi "Biasa" diinstal oleh pengguna.
- Aplikasi "Berhak istimewa" sudah diinstal sebelumnya di perangkat. Ini termasuk Google Assistant, dan semua layanan aksesibilitas.
Selain itu, aplikasi diperlakukan secara berbeda
jika menggunakan sumber audio "sensitif privasi":
CAMCORDER
atau VOICE_COMMUNICATION
.
Aturan penentuan prioritas untuk menggunakan dan berbagi input audio adalah sebagai berikut:
- Aplikasi khusus memiliki prioritas lebih tinggi daripada aplikasi biasa.
- Aplikasi dengan UI latar depan yang terlihat memiliki prioritas lebih tinggi daripada aplikasi latar belakang.
- Aplikasi yang menangkap audio dari sumber sensitif privasi memiliki prioritas lebih tinggi daripada aplikasi yang tidak.
- Dua aplikasi biasa tidak akan pernah bisa menangkap audio secara bersamaan.
- Dalam beberapa situasi, aplikasi khusus dapat berbagi input audio dengan aplikasi lain.
- Jika dua aplikasi latar belakang dengan prioritas yang sama menangkap audio, aplikasi yang terakhir dimulai memiliki prioritas yang lebih tinggi.
Skenario berbagi
Saat dua aplikasi mencoba merekam audio, keduanya mungkin dapat menerima sinyal input, atau salah satunya mungkin menerima diam.
Ada empat skenario utama:
- Asisten + aplikasi biasa
- Layanan aksesibilitas + aplikasi biasa
- Dua aplikasi biasa
- Panggilan suara + aplikasi biasa
Asisten + aplikasi biasa
Asisten adalah aplikasi dengan hak istimewa karena sudah diinstal sebelumnya dan memiliki
peran RoleManager.ROLE_ASSISTANT
.
Aplikasi yang diinstal sebelumnya lainnya dengan peran ini diperlakukan serupa.
Android membagikan audio input sesuai dengan aturan ini:
Asisten dapat menerima audio (baik di latar depan maupun latar belakang) kecuali jika aplikasi lain yang menggunakan sumber audio yang sensitif terhadap privasi sudah merekam.
Aplikasi menerima audio kecuali jika Asisten memiliki komponen UI yang terlihat di bagian atas layar.
Perhatikan bahwa kedua aplikasi hanya menerima audio saat Asisten berada di latar belakang dan aplikasi lain tidak merekam dari sumber audio yang sensitif terhadap privasi.
Layanan aksesibilitas + aplikasi biasa
AccessibilityService
memerlukan deklarasi yang ketat.
Android membagikan audio input sesuai dengan aturan ini:
Jika UI layanan berada di atas, layanan dan aplikasi akan menerima input audio. Perilaku ini menawarkan fungsionalitas seperti mengontrol panggilan suara atau pengambilan video dengan perintah suara.
Jika layanan tidak di atas, kasus ini diperlakukan seperti kasus dua aplikasi biasa di bawah ini.
Dua aplikasi biasa
Ketika dua aplikasi menangkap secara bersamaan, hanya satu aplikasi yang menerima audio dan yang lainnya menerima keheningan (senyap).
Android membagikan audio input sesuai dengan aturan ini:
- Jika tidak ada aplikasi yang sensitif terhadap privasi, aplikasi dengan UI di bagian atas akan menerima audio. Jika tidak ada aplikasi yang memiliki UI, aplikasi yang mulai menangkap paling baru menerima audio.
- Jika salah satu aplikasi sensitif terhadap privasi, aplikasi tersebut akan menerima audio dan aplikasi lain akan mendapatkan keheningan meskipun memiliki UI di bagian atas atau mulai merekam baru-baru ini.
- Jika kedua aplikasi sensitif terhadap privasi, aplikasi yang mulai merekam paling baru akan menerima audio dan aplikasi lainnya akan mendapatkan keheningan.
Panggilan suara + aplikasi biasa
Panggilan suara aktif jika mode audio yang ditampilkan oleh
AudioManager.getMode()
adalah
MODE_IN_CALL
atau
MODE_IN_COMMUNICATION
.
Android membagikan audio input sesuai dengan aturan ini:
- Panggilan selalu menerima audio.
- Aplikasi dapat merekam audio jika merupakan layanan aksesibilitas.
Aplikasi dapat merekam panggilan suara jika merupakan aplikasi (bawaan) dengan hak istimewa dengan izin
CAPTURE_AUDIO_OUTPUT
.Untuk merekam uplink (TX), downlink (RX), atau keduanya dari panggilan suara, aplikasi harus menentukan sumber audio
MediaRecorder.AudioSource.VOICE_UPLINK
atauMediaRecorder.AudioSource.VOICE_DOWNLINK
, dan/atau perangkatAudioDeviceInfo.TYPE_TELEPHONY
.
Perilaku Android 11
Android 11 (API level 30) mengamati skema prioritas Android 10
yang dijelaskan di atas. API ini juga menyediakan metode baru di AudioRecord
, MediaRecorder
, dan
AAudioStream
yang mengaktifkan dan menonaktifkan kemampuan untuk merekam audio secara serentak,
terlepas dari kasus penggunaan yang dipilih.
Metode baru tersebut adalah:
AudioRecord.Builder.setPrivacySensitive()
AudioRecord.isPrivacySensitive()
MediaRecorder.setPrivacySensitive()
MediaRecorder.isPrivacySensitive()
AAudioStreamBuilder_setPrivacySensitive()
AAudioStream_isPrivacySensitive()
Jika setPrivacySensitive()
bernilai true
, kasus penggunaan perekaman bersifat pribadi dan bahkan
Asisten dengan hak istimewa tidak dapat merekam secara serentak. Setelan ini menggantikan
perilaku default yang bergantung pada sumber audio. Misalnya,
VOICE_COMMUNICATION
bersifat pribadi secara default, tetapi UNPROCESSED
tidak.
Perubahan konfigurasi
Saat beberapa aplikasi merekam audio secara bersamaan, hanya satu atau dua aplikasi yang "aktif" (menerima audio); yang lainnya dibisukan (menerima keheningan). Saat aplikasi aktif berubah, framework audio dapat mengonfigurasi ulang jalur audio sesuai dengan aturan berikut:
- Perangkat input audio untuk setiap aplikasi aktif dapat berubah (misalnya, dari mikrofon bawaan ke headset bluetooth yang terpasang).
- Prapemrosesan yang terkait dengan aplikasi aktif prioritas tertinggi diaktifkan. Semua pemrosesan awal lainnya akan diabaikan.
Karena aplikasi yang aktif mungkin dibisukan saat aplikasi dengan prioritas lebih tinggi menjadi aktif,
Anda dapat mendaftarkan
AudioManager.AudioRecordingCallback
pada objek AudioRecord
atau MediaRecorder
untuk mendapatkan notifikasi saat konfigurasi berubah.
Perubahan yang mungkin terjadi adalah:
- Penangkapan disenyapkan atau tidak
- Perangkat berubah
- Prapemrosesan berubah
- Properti streaming berubah (frekuensi pengambilan sampel, mask saluran, format sampel)
Anda harus memanggil
AudioRecord.registerAudioRecordingCallback()
sebelum pengambilan dimulai.
Callback dijalankan hanya ketika aplikasi menerima audio dan terjadi perubahan.
Metode onRecordingConfigChanged()
menampilkan AudioRecordingConfiguration
yang berisi status perekaman audio saat ini. Gunakan metode
berikut untuk mempelajari perubahan tersebut:
isClientSilenced()
- Menampilkan true jika audio yang ditampilkan ke klien sedang dibungkam karena kebijakan pengambilan.
getAudioDevice()
- Menampilkan perangkat audio yang aktif.
getEffects()
- Menampilkan efek prapemrosesan yang aktif. Perhatikan bahwa efek aktif mungkin tidak sama dengan yang ditampilkan oleh
getClientEffects()
jika klien bukan aplikasi aktif dengan prioritas tertinggi. getFormat()
- Menampilkan properti streaming. Perhatikan bahwa data audio sebenarnya yang diterima oleh klien selalu mengikuti format yang diperlukan yang ditampilkan oleh
getClientFormat()
. Framework ini otomatis melakukan konversi resampling, saluran, dan format yang diperlukan dari format yang digunakan di antarmuka hardware ke format yang ditentukan oleh klien. AudioRecord.getActiveRecordingConfiguration()
.- Menampilkan konfigurasi perekaman aktif.
Anda bisa mendapatkan tampilan umum dari semua rekaman aktif di perangkat dengan memanggil
AudioManager.getActiveRecordingConfigurations()
.