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 atau lebih aplikasi mungkin ingin "mengambil" input audio yang sama. Aplikasi mungkin melakukan tugas yang berbeda. Misalnya, beberapa aplikasi yang menerima audio mungkin "merekam", seperti perekam suara sederhana, sementara aplikasi lain mungkin "mendengarkan," seperti Google Assistant atau layanan aksesibilitas yang merespons perintah suara.
Dalam kedua kasus tersebut, aplikasi ini ingin menerima input audio. Sepanjang halaman ini, kami menggunakan istilah "tangkap" terlepas dari apakah aplikasi sedang merekam atau hanya mendengarkan.
Jika dua atau beberapa aplikasi ingin menangkap audio pada saat yang sama, mungkin ada masalah pengiriman sinyal audio dari sumber yang sama ke aplikasi tersebut. Halaman ini menjelaskan cara sistem Android membagikan input audio antara beberapa aplikasi yang menangkap audio.
Perilaku pra-Android 10
Sebelum Android 10 streaming audio input hanya dapat ditangkap oleh satu aplikasi pada satu waktu. Jika beberapa aplikasi sudah merekam atau mendengarkan audio, aplikasi Anda dapat membuat objek AudioRecord
, tetapi sebuah error akan ditampilkan saat Anda memanggil AudioRecord.startRecording()
dan perekaman tidak akan dimulai.
Satu pengecualian untuk aturan ini adalah ketika aplikasi khusus (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. Ketika itu terjadi, aplikasi khusus dihentikan dan aplikasi baru menangkap input.
Satu lagi perubahan ditambahkan di Android 9: hanya aplikasi yang berjalan di latar depan (atau layanan latar depan) yang dapat menangkap input audio. Jika aplikasi tanpa layanan latar depan atau komponen UI latar depan mulai menangkap, aplikasi tersebut terus berjalan tetapi akan senyap, bahkan jika itu adalah satu-satunya aplikasi menangkap audio pada saat itu.
Perilaku baru
Perilaku sebelumnya adalah "pertama datang, pertama dilayani." Setelah aplikasi mulai menangkap audio, semua aplikasi lain tidak memiliki cara untuk mengakses input audio sampai aplikasi yang menangkap berhenti.
Android 10 (level API 29) dan yang lebih tinggi menerapkan skema prioritas yang dapat mengalihkan streaming audio input antar-aplikasi saat berjalan. Biasanya, jika aplikasi baru memperoleh input audio, aplikasi yang sebelumnya ditangkap akan terus berjalan, tetapi menerima keheningan (senyap). Dalam beberapa kasus, sistem dapat terus mengirimkan audio ke kedua aplikasi. Berbagai skenario berbagi dijelaskan di bawah ini.
Skema ini mirip dengan cara fokus audio menangani beberapa aplikasi yang bersaing untuk penggunaan output audio. Namun, fokus audio dikelola oleh permintaan terprogram untuk mendapatkan dan melepaskan fokus, sementara skema pengalihan input yang dijelaskan di sini didasarkan pada kebijakan prioritas yang diterapkan secara otomatis setiap kali aplikasi baru mulai menangkap audio.
Untuk keperluan menangkap audio, Android membedakan dua jenis aplikasi:
- Aplikasi "Biasa" diinstal oleh pengguna.
- Aplikasi "Khusus" 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
Ketika dua aplikasi mencoba menangkap audio, keduanya mungkin dapat menerima sinyal input, atau salah satunya mungkin menerima keheningan (senyap).
Ada empat skenario utama:
- Asisten + aplikasi biasa
- Layanan aksesibilitas + aplikasi biasa
- Dua aplikasi biasa
- Panggilan suara + aplikasi biasa
Asisten + aplikasi biasa
Asisten adalah aplikasi khusus karena sudah diinstal sebelumnya dan memegang 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 atau di latar belakang) kecuali aplikasi lain yang menggunakan sumber audio yang sensitif privasi sudah ditangkap.
Aplikasi ini menerima audio kecuali Asisten memiliki komponen UI yang terlihat di atas layar.
Ingat bahwa kedua aplikasi hanya menerima audio ketika Asisten berada di latar belakang dan aplikasi lainnya tidak menangkap dari sumber audio yang sensitif privasi.
Layanan aksesibilitas + aplikasi biasa
AccessibilityService
memerlukan deklarasi ketat .
Android membagikan audio input sesuai dengan aturan ini:
Jika UI layanan di atas, baik layanan dan aplikasi 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 privasi, aplikasi dengan UI di atas menerima audio. Jika tidak ada aplikasi yang memiliki UI, aplikasi yang mulai menangkap paling baru menerima audio.
- Jika salah satu aplikasi yang sensitif privasi, aplikasi akan menerima audio dan aplikasi lainnya senyap walaupun memiliki UI di bagian atas atau mulai menangkap yang lebih baru.
- Jika kedua aplikasi sensitif privasi, aplikasi yang mulai menangkap paling baru menerima audio dan yang lainnya senyap.
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 ini dapat menangkap audio jika ini merupakan layanan aksesibilitas.
Aplikasi ini dapat menangkap panggilan suara jika itu adalah aplikasi khusus (bawaan) dengan izin
CAPTURE_AUDIO_OUTPUT
.Untuk menangkap uplink panggilan suara (TX), downlink (RX), atau keduanya, aplikasi harus menentukan sumber audio
MediaRecorder.AudioSource.VOICE_UPLINK
atauMediaRecorder.AudioSource.VOICE_DOWNLINK
, dan/atau perangkatAudioDeviceInfo.TYPE_TELEPHONY
.
Perubahan konfigurasi
Ketika beberapa aplikasi menangkap audio secara bersamaan, hanya satu atau dua yang "aktif" (menerima audio); yang lain disenyapkan (senyap). Saat aplikasi aktif berubah, framework audio mungkin mengonfigurasi ulang jalur audio sesuai dengan aturan ini:
- Perangkat input audio untuk setiap aplikasi yang aktif dapat berubah (misalnya, dari mikrofon bawaan ke headset bluetooth yang terpasang).
- Prapemrosesan yang terkait dengan aplikasi aktif prioritas tertinggi diaktifkan. Semua prapemrosesan lainnya diabaikan.
Karena aplikasi aktif mungkin disenyapkan ketika aplikasi prioritas tinggi menjadi aktif, Anda dapat mendaftarkan AudioManager.AudioRecordingCallback pada AudioRecord
atau MediaRecorder
objek untuk diberi tahu ketika 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 pengambilan audio saat ini. Gunakan metode berikut untuk mempelajari tentang perubahan:
isClientSilenced()
- Menampilkan nilai true jika audio yang ditampilkan ke klien sedang dibungkam karena kebijakan penangkapan.
getAudioDevice()
- Menampilkan perangkat audio aktif.
getEffects()
- Menampilkan efek prapemrosesan aktif. Ingat bahwa efek aktif mungkin tidak sama dengan efek yang ditampilkan oleh
getClientEffects()
jika klien bukan aplikasi aktif prioritas tertinggi. getFormat()
- Menampilkan properti streaming. Ingat bahwa data audio aktual yang diterima oleh klien selalu memperhatikan format yang diminta yang dikembalikan oleh
getClientFormat()
. Framework secara otomatis melakukan konversi format, resampling, dan saluran 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 pada perangkat dengan memanggil AudioManager.getActiveRecordingConfigurations()
.