Berbagi input audio

Input audio biasanya berasal dari mikrofon bawaan, mikrofon eksternal, atau antarmuka audio yang terhubung 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 "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. Sepanjang halaman ini, kami menggunakan istilah "capture" terlepas dari apakah sedang merekam atau hanya mendengarkan.

Jika dua aplikasi atau lebih ingin merekam audio secara bersamaan, mungkin ada masalah memberikan sinyal audio dari sumber yang sama ke mereka semua. Halaman ini menjelaskan cara sistem Android membagikan input audio ke beberapa aplikasi yang merekam audio.

Perilaku pra-Android 10

Sebelum Android 10, streaming audio input hanya dapat direkam oleh satu aplikasi di baik. 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 dimulai.

Satu pengecualian untuk aturan ini adalah ketika aplikasi dengan hak istimewa (seperti Asisten Google atau layanan aksesibilitas) memiliki izin android.permission.CAPTURE_AUDIO_HOTWORD dan menggunakan jenis sumber audio HOTWORD. Dalam hal ini aplikasi lain dapat mulai merekam. Ketika hal itu terjadi aplikasi dengan hak istimewa dihentikan dan aplikasi baru merekam input.

Satu perubahan lagi ditambahkan di Android 9: hanya aplikasi yang berjalan di latar depan (atau layanan latar depan) dapat menangkap input audio. Jika aplikasi tanpa layanan latar depan atau komponen UI latar depan mulai menangkap, terus berjalan tetapi mendapat keheningan, bahkan jika itu adalah satu-satunya aplikasi yang menangkap 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 dijalankan. Pada umumnya, jika aplikasi baru mendapatkan input audio, aplikasi yang sebelumnya direkam akan terus berjalan, namun menerima keheningan. Di beberapa 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 bersaing dalam menggunakan output audio. Namun, fokus audio dikelola oleh terprogram untuk mendapatkan dan melepaskan fokus, sementara skema 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:

  • "Biasa" aplikasi diinstal oleh pengguna.
  • "Eksklusif" aplikasi sudah diinstal sebelumnya di perangkat. Ini termasuk Google Assistant, dan semua layanan aksesibilitas.

Selain itu, aplikasi diperlakukan secara berbeda jika menggunakan atribut "sensitif privasi" sumber audio: 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 menangkap audio, mereka berdua mungkin dapat menerima sinyal input, atau salah satunya dapat menerima 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 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 (terlepas apakah itu di latar depan atau latar belakang) kecuali aplikasi lain yang menggunakan sumber audio yang sensitif privasi sudah merekam.

  • Aplikasi menerima audio kecuali Asisten memiliki UI yang terlihat komponen di atas layar.

Perlu diperhatikan bahwa kedua aplikasi hanya menerima audio saat Asisten berada di latar belakang dan aplikasi satunya 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 di atas, baik layanan maupun aplikasi akan menerima input audio. Perilaku ini menawarkan fungsi seperti mengontrol panggilan suara atau video merekam 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 atasnya 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 itu akan menerima audio dan aplikasi lain akan disenyapkan meskipun memiliki UI di bagian atasnya atau mulai menangkap belakangan ini.
  • Jika kedua aplikasi sensitif terhadap privasi, aplikasi yang mulai menangkap baru saja menerima audio dan yang lain disenyapkan.

Panggilan suara + aplikasi biasa

Panggilan suara aktif jika mode audio yang ditampilkan oleh AudioManager.getMode() sama dengan MODE_IN_CALL atau MODE_IN_COMMUNICATION.

Android membagikan audio input sesuai dengan aturan ini:

Perilaku Android 11

Android 11 (API level 30) mengamati skema prioritas Android 10 yang dijelaskan di atas. Class ini juga menyediakan metode baru di AudioRecord, MediaRecorder, dan AAudioStream yang mengaktifkan dan menonaktifkan kemampuan merekam audio secara serentak, terlepas dari kasus penggunaan yang dipilih.

Metode baru tersebut adalah:

Jika setPrivacySensitive() adalah true, kasus penggunaan perekaman akan bersifat pribadi dan bahkan Asisten dengan hak istimewa tidak dapat merekam secara serentak. Setelan ini mengganti perilaku default yang bergantung pada sumber audio. Contohnya, VOICE_COMMUNICATION bersifat pribadi secara default, tetapi UNPROCESSED tidak.

Perubahan konfigurasi

Ketika beberapa aplikasi merekam audio secara bersamaan, hanya satu atau dua aplikasi yang "aktif" (menerima audio); yang lain disenyapkan (menerima keheningan). Jika aplikasi aktif berubah, framework audio dapat mengonfigurasi ulang jalur audio sesuai dengan aturan ini:

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

Karena aplikasi aktif mungkin disenyapkan ketika aplikasi dengan prioritas lebih tinggi menjadi aktif, Anda dapat mendaftarkan AudioManager.AudioRecordingCallback pada AudioRecord atau MediaRecorder yang akan diberi tahu 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 perekaman dimulai. Callback dijalankan hanya ketika aplikasi menerima audio dan terjadi perubahan.

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

isClientSilenced()
Menampilkan nilai benar (true) jika audio yang ditampilkan kepada klien saat ini disenyapkan karena kebijakan perekaman.
getAudioDevice()
Menampilkan perangkat audio yang aktif.
getEffects()
Menampilkan efek pra-pemrosesan aktif. Perhatikan bahwa efek aktif mungkin tidak sama dengan efek yang ditampilkan oleh getClientEffects() jika klien bukan aplikasi aktif dengan prioritas tertinggi.
getFormat()
Menampilkan properti aliran data. Perlu diperhatikan bahwa data audio aktual yang diterima oleh klien selalu mengikuti format yang diperlukan yang ditampilkan oleh getClientFormat(). Framework ini secara otomatis melakukan konversi format, saluran, dan resampling yang diperlukan dari format yang digunakan pada 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()