Berbagi input audio

Input audio biasanya berasal dari mikrofon bawaan, mikrofon eksternal, atau antarmuka audio yang terpasang ke perangkat. Input audio juga dapat berasal dari percakapan telepon.

Terkadang, dua aplikasi atau lebih mungkin ingin "merekam" input audio yang sama. Mereka mungkin melakukan tugas yang berbeda. Misalnya, beberapa aplikasi yang menerima audio mungkin "merekam", seperti perekam suara sederhana, sementara 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 sedang merekam atau hanya mendengarkan.

Jika dua aplikasi atau lebih ingin merekam audio secara bersamaan, mungkin akan ada masalah dalam mengirimkan sinyal audio dari sumber yang sama ke semua aplikasi tersebut. Halaman ini menjelaskan cara sistem Android membagikan input audio di antara beberapa aplikasi yang merekam audio.

Perilaku sebelum Android 10

Sebelum Android 10, streaming audio input hanya dapat direkam oleh satu aplikasi dalam satu waktu. 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. Saat 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 tidak menerima audio, meskipun aplikasi tersebut adalah 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 antar-aplikasi saat aplikasi berjalan. Pada 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 tujuan perekaman audio, Android membedakan dua jenis aplikasi:

  • Aplikasi "biasa" diinstal oleh pengguna.
  • Aplikasi "dengan hak istimewa" sudah diinstal sebelumnya di perangkat. Ini termasuk Asisten Google, dan semua layanan aksesibilitas.

Selain itu, aplikasi diperlakukan secara berbeda jika menggunakan sumber audio "sensitif privasi": CAMCORDER atau VOICE_COMMUNICATION.

Aturan prioritas untuk menggunakan dan membagikan input audio adalah sebagai berikut:

  • Aplikasi dengan hak istimewa memiliki prioritas yang lebih tinggi daripada aplikasi biasa.
  • Aplikasi dengan UI latar depan yang terlihat memiliki prioritas lebih tinggi daripada aplikasi latar belakang.
  • Aplikasi yang merekam audio dari sumber yang sensitif terhadap privasi memiliki prioritas lebih tinggi daripada aplikasi yang tidak.
  • Dua aplikasi biasa tidak akan pernah dapat merekam audio secara bersamaan.
  • Dalam beberapa situasi, aplikasi dengan hak istimewa dapat berbagi input audio dengan aplikasi lain.
  • Jika dua aplikasi latar belakang dengan prioritas yang sama merekam audio, aplikasi yang terakhir dimulai memiliki prioritas lebih tinggi.

Skenario berbagi

Saat dua aplikasi mencoba merekam audio, keduanya mungkin dapat menerima sinyal input, atau salah satunya mungkin menerima keheningan.

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 telah diinstal sebelumnya dan memiliki peran RoleManager.ROLE_ASSISTANT. Aplikasi terinstal lainnya dengan peran ini akan diperlakukan sama.

Android membagikan audio input sesuai dengan aturan berikut:

  • 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 lainnya 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 berikut:

  • Jika UI layanan berada di atas, layanan dan aplikasi akan menerima input audio. Perilaku ini menawarkan fungsi seperti mengontrol panggilan suara atau perekaman video dengan perintah suara.

  • Jika layanan tidak berada di atas, kasus ini diperlakukan seperti kasus dua aplikasi biasa di bawah.

Dua aplikasi biasa

Jika dua aplikasi merekam secara bersamaan, hanya satu aplikasi yang menerima audio dan aplikasi lainnya akan menerima audio senyap.

Android membagikan audio input sesuai dengan aturan berikut:

  • Jika kedua aplikasi tidak sensitif terhadap privasi, aplikasi dengan UI di atas akan menerima audio. Jika tidak ada aplikasi yang memiliki UI, aplikasi yang memulai perekaman paling baru akan menerima audio.
  • Jika salah satu aplikasi bersifat sensitif terhadap privasi, aplikasi tersebut akan menerima audio dan aplikasi lainnya akan mendapatkan keheningan meskipun memiliki UI di atas atau mulai merekam lebih baru.
  • Jika kedua aplikasi sensitif terhadap privasi, aplikasi yang mulai merekam paling baru akan menerima audio dan aplikasi lainnya akan menerima audio 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 berikut:

Perilaku Android 11

Android 11 (level API 30) mengamati skema prioritas Android 10 yang dijelaskan di atas. Library 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:

Jika setPrivacySensitive() adalah true, kasus penggunaan pengambilan bersifat pribadi dan bahkan Asisten dengan hak istimewa tidak dapat melakukan pengambilan secara serentak. Setelan ini mengganti 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); aplikasi lainnya dibisukan (menerima keheningan). Saat aplikasi aktif berubah, framework audio mungkin mengonfigurasi ulang jalur audio sesuai dengan aturan berikut:

  • Perangkat input audio untuk setiap aplikasi aktif mungkin berubah (misalnya, dari mikrofon bawaan ke headset Bluetooth yang terpasang).
  • Pra-pemrosesan yang terkait dengan aplikasi aktif berprioritas tertinggi akan diaktifkan. Semua pra-pemrosesan lainnya akan diabaikan.

Karena aplikasi yang aktif mungkin akan disenyapkan saat aplikasi dengan prioritas lebih tinggi menjadi aktif, Anda dapat mendaftarkan AudioManager.AudioRecordingCallback pada objek AudioRecord atau MediaRecorder untuk diberi tahu saat konfigurasi berubah. Kemungkinan perubahan dapat berupa:

  • Merekam suara yang disenyapkan atau tidak disenyapkan
  • Perangkat diubah
  • Prapemrosesan diubah
  • Properti streaming berubah (frekuensi sampling, mask saluran, format sampel)

Anda harus memanggil AudioRecord.registerAudioRecordingCallback() sebelum perekaman dimulai. Callback hanya dijalankan saat aplikasi menerima audio dan terjadi perubahan.

Metode onRecordingConfigChanged() menampilkan AudioRecordingConfiguration yang berisi status perekaman audio saat ini. Gunakan metode berikut untuk mempelajari perubahan:

isClientSilenced()
Menampilkan nilai benar (true) jika audio yang ditampilkan ke klien saat ini sedang dibisukan karena kebijakan perekaman.
getAudioDevice()
Menampilkan perangkat audio yang aktif.
getEffects()
Menampilkan efek pra-pemrosesan 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 secara otomatis melakukan resampling, saluran, dan konversi 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 semua rekaman aktif di perangkat dengan memanggil AudioManager.getActiveRecordingConfigurations().