音訊輸入通常來自內建麥克風、外接式麥克風或 音訊介面與裝置相連音訊輸入也可以來自 或一段電話對話
有時兩個以上的應用程式可能都想「擷取」同一個音訊輸入來源 他們可能正在執行不同的工作。 舉例來說,某些收到音訊的應用程式可能是「錄音」像簡單的語音錄音工具 其他應用程式也可以「收聽」例如 Google 助理或無障礙服務 回應語音指令
無論是哪種情況,這些應用程式都想接收音訊輸入。 在此網頁中,我們使用「擷取」一詞無論 應用程式正在錄音或只是正在聆聽
如果有兩個以上的應用程式想同時擷取音訊,問題可能出在 將相同來源的音訊訊號傳送給所有網路。本頁面說明 Android 系統如何在多個擷取音訊的應用程式之間共用音訊輸入。
Android 10 之前的行為
在 Android 10 之前,只有一個應用程式能夠擷取輸入音訊串流。
讓應用程式從可以最快做出回應的位置
回應使用者要求如果某些應用程式已在錄製或聆聽音訊,應用程式可以
建立 AudioRecord
物件,但呼叫時會傳回錯誤
AudioRecord.startRecording()
系統就不會開始錄製
但有特殊權限的應用程式 (例如 Google 助理或具有特殊權限的應用程式)
無障礙服務) 擁有權限
「android.permission.CAPTURE_AUDIO_HOTWORD
」並使用類型的音訊來源
HOTWORD
。在這種情況下,其他應用程式可以開始錄影。發生這種情況時
具有特殊權限的應用程式終止,且新的應用程式會擷取輸入內容。
Android 9 新增了一項異動:只有在前景執行的應用程式 (或 前景服務) 能擷取音訊輸入內容。如果應用程式沒有 應用程式啟動擷取的前景服務或前景 UI 元件 應用程式繼續運轉,但收到無聲片段,即使這是否為唯一擷取的應用程式 只播放音訊
Android 10 行為
在 Android 10 之前的運作模式是「先到先得,」。 應用程式開始擷取音訊後,其他應用程式就無法存取 音訊輸入,直到擷取音訊的應用程式停止為止。
Android 10 的優先配置可切換輸入音訊串流 之間的不同之處在大多數情況下,如果新應用程式取得音訊輸入內容 先前擷取的應用程式會繼續執行,但會靜音。某些 遇到這種情況,系統就會繼續將音訊提供給這兩個應用程式。各項 分享情境。
這個配置與音訊焦點處理多個應用程式的方式類似 。不過,音訊焦點是由 接收及發布焦點的要求 此處描述的配置取決於適用的優先順序政策 自動擷取音訊。
為擷取音訊,Android 會辨別以下兩種應用程式:
- 「普通」使用者自行安裝的應用程式
- 「特殊權限」應用程式。包括 Google 助理和所有無障礙服務。
此外,應用程式的處理方式也有所不同
如果設定會「基於隱私考量」音訊來源:
CAMCORDER
敬上
或 VOICE_COMMUNICATION
。
使用及分享音訊輸入的優先順序規則如下:
- 具有特殊權限的應用程式的優先順序高於一般應用程式。
- 具備可見前景 UI 的應用程式,優先順序高於背景應用程式。
- 如果應用程式從注重隱私權的來源擷取音訊,其優先順序將高於其他應用程式。
- 兩個一般應用程式無法同時擷取音訊。
- 在某些情況下,具有特殊權限的應用程式可以將音訊輸入分享給其他應用程式。
- 如果兩個優先順序相同的背景應用程式正在擷取音訊,最後一個啟動的應用程式的優先順序較高。
分享情境
當兩個應用程式嘗試擷取音訊時 兩者都能接收輸入信號,或是兩者都接收 無聲。
主要情況有以下四種:
- Google 助理和一般應用程式
- 無障礙服務 + 一般應用程式
- 兩款一般應用程式
- 語音通話 + 一般應用程式
Google 助理和一般應用程式
Google 助理是具有特殊權限的應用程式,因為該應用程式已預先安裝
RoleManager.ROLE_ASSISTANT
角色。
對於具備這個角色的任何其他預先安裝應用程式,系統同樣採取類似的處理方式。
Android 會根據下列規則共用輸入音訊:
無論是在前景或背景,Google 助理皆可接收音訊 。
除非 Google 助理具有可見 UI,否則應用程式會收到音訊 元件。
請注意,兩個應用程式只會在 Google 助理於背景運作時接收音訊 且其他應用程式未從基於隱私考量的音訊來源擷取。
無障礙服務 + 一般應用程式
AccessibilityService
需要嚴格的宣告
Android 會根據下列規則共用輸入音訊:
如果服務的 UI 位於頂端,那麼服務和應用程式都會收到 音訊輸入。此行為提供控制語音通話或視訊通話等功能 透過語音指令擷取圖片。
如果服務不在頂層,則系統會將此情況視為下列一般的兩個應用程式案例。
兩款一般應用程式
當兩個應用程式同時擷取時,只有一個應用程式會接收音訊,另一個應用程式會靜音。
Android 會根據下列規則共用輸入音訊:
- 如果兩者都不具隱私敏感性 頂端顯示 UI 的應用程式可接收音訊 如果兩個應用程式都沒有 UI,則啟動擷取作業的應用程式會收到最近接收的音訊。
- 如果其中一款應用程式含有隱私權保護資料,就會接收音訊,並 即使其他應用程式上層有 UI 或是已開始擷取 。
- 如果兩個應用程式都保障隱私權,則開始擷取 另一部裝置會靜音
語音通話 + 一般應用程式
如果
AudioManager.getMode()
是
MODE_IN_CALL
或
MODE_IN_COMMUNICATION
。
Android 會根據下列規則共用輸入音訊:
- 通話一律會接收音訊。
- 應用程式可以擷取音訊 無障礙服務。
如果應用程式具備特殊權限,即可擷取語音來電 (預先安裝) 授予權限的應用程式
CAPTURE_AUDIO_OUTPUT
。如要擷取語音通話的上行按鈕 (TX)、向下連結 (RX),或同時擷取兩者,應用程式必須 指定音訊來源
MediaRecorder.AudioSource.VOICE_UPLINK
或MediaRecorder.AudioSource.VOICE_DOWNLINK
、 和/或裝置AudioDeviceInfo.TYPE_TELEPHONY
。
Android 11 行為
Android 11 (API 級別 30) 會觀察 Android 10 的優先順序配置
相同。此外,它也會提供 AudioRecord
、MediaRecorder
與
AAudioStream
可啟用及停用同時擷取音訊的功能。
無論所選用途為何
新方法如下:
AudioRecord.Builder.setPrivacySensitive()
AudioRecord.isPrivacySensitive()
MediaRecorder.setPrivacySensitive()
MediaRecorder.isPrivacySensitive()
AAudioStreamBuilder_setPrivacySensitive()
AAudioStream_isPrivacySensitive()
當 setPrivacySensitive()
為 true
時,擷取用途為私有,甚至
特殊權限助理無法同時擷取畫面。這項設定會覆寫
取決於音訊來源的預設行為舉例來說:
VOICE_COMMUNICATION
預設為私人狀態,但 UNPROCESSED
不是。
設定變更
如果有多個應用程式同時擷取音訊,應用程式只會有一或兩個應用程式 「有效」(接收音訊);其他方處於靜音狀態 (接收靜音)。當 使用中的應用程式有所變更,音訊架構可能會重新設定音訊路徑 :
- 每個使用中應用程式的音訊輸入裝置可能會變更 (例如從 內建麥克風)。
- 與優先順序最高的有效應用程式相關聯的預先處理作業已啟用。所有語言 就會忽略其他預先處理作業
由於高優先順序應用程式啟用時,運作中的應用程式可能會靜音,
您可以註冊
AudioManager.AudioRecordingCallback
AudioRecord
或 MediaRecorder
物件,接收設定變更通知。
可能的變更包括:
- 拍攝無聲或靜音畫面
- 裝置已變更
- 預先處理已變更
- 串流屬性已變更 (取樣率、聲道遮罩、範例格式)
你必須撥打
AudioRecord.registerAudioRecordingCallback()
敬上
即可開始擷取。
只有在應用程式接收音訊且發生變更時,系統才會執行回呼。
方法 onRecordingConfigChanged()
會傳回包含目前音訊擷取狀態的 AudioRecordingConfiguration
。使用下列參數
方法,協助您瞭解這項變更:
isClientSilenced()
- 如果基於擷取政策,傳回用戶端的音訊目前設為靜音,則傳回 true。
getAudioDevice()
- 傳回使用中的音訊裝置。
getEffects()
- 傳回使用中的預先處理效果。請注意,如果用戶端不是優先順序最高的使用中應用程式,啟用中效果可能與
getClientEffects()
傳回的效果不同。 getFormat()
- 傳回串流屬性。請注意,用戶端收到的實際音訊資料一律會遵循
getClientFormat()
傳回的要求格式。該架構會自動從硬體介面使用的格式,按照用戶端指定的格式進行必要的重新取樣、管道和格式轉換。 AudioRecord.getActiveRecordingConfiguration()
。- 傳回進行中的錄製設定。
你可以透過撥號方式,概略瞭解裝置上所有正在錄製的錄音檔
AudioManager.getActiveRecordingConfigurations()
。