分享音訊輸入內容

音訊輸入通常來自內建麥克風、外接式麥克風或 音訊介面與裝置相連音訊輸入也可以來自 或一段電話對話

有時兩個以上的應用程式可能都想「擷取」同一個音訊輸入來源 他們可能正在執行不同的工作。 舉例來說,某些收到音訊的應用程式可能是「錄音」像簡單的語音錄音工具 其他應用程式也可以「收聽」例如 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_CALLMODE_IN_COMMUNICATION

Android 會根據下列規則共用輸入音訊:

Android 11 行為

Android 11 (API 級別 30) 會觀察 Android 10 的優先順序配置 相同。此外,它也會提供 AudioRecordMediaRecorderAAudioStream 可啟用及停用同時擷取音訊的功能。 無論所選用途為何

新方法如下:

setPrivacySensitive()true 時,擷取用途為私有,甚至 特殊權限助理無法同時擷取畫面。這項設定會覆寫 取決於音訊來源的預設行為舉例來說: VOICE_COMMUNICATION預設為私人狀態,但 UNPROCESSED 不是。

設定變更

如果有多個應用程式同時擷取音訊,應用程式只會有一或兩個應用程式 「有效」(接收音訊);其他方處於靜音狀態 (接收靜音)。當 使用中的應用程式有所變更,音訊架構可能會重新設定音訊路徑 :

  • 每個使用中應用程式的音訊輸入裝置可能會變更 (例如從 內建麥克風)。
  • 與優先順序最高的有效應用程式相關聯的預先處理作業已啟用。所有語言 就會忽略其他預先處理作業

由於高優先順序應用程式啟用時,運作中的應用程式可能會靜音, 您可以註冊 AudioManager.AudioRecordingCallback AudioRecordMediaRecorder 物件,接收設定變更通知。 可能的變更包括:

  • 拍攝無聲或靜音畫面
  • 裝置已變更
  • 預先處理已變更
  • 串流屬性已變更 (取樣率、聲道遮罩、範例格式)

你必須撥打 AudioRecord.registerAudioRecordingCallback()敬上 即可開始擷取。 只有在應用程式接收音訊且發生變更時,系統才會執行回呼。

方法 onRecordingConfigChanged() 會傳回包含目前音訊擷取狀態的 AudioRecordingConfiguration。使用下列參數 方法,協助您瞭解這項變更:

isClientSilenced()
如果基於擷取政策,傳回用戶端的音訊目前設為靜音,則傳回 true。
getAudioDevice()
傳回使用中的音訊裝置。
getEffects()
傳回使用中的預先處理效果。請注意,如果用戶端不是優先順序最高的使用中應用程式,啟用中效果可能與 getClientEffects() 傳回的效果不同。
getFormat()
傳回串流屬性。請注意,用戶端收到的實際音訊資料一律會遵循 getClientFormat() 傳回的要求格式。該架構會自動從硬體介面使用的格式,按照用戶端指定的格式進行必要的重新取樣、管道和格式轉換。
AudioRecord.getActiveRecordingConfiguration()
傳回進行中的錄製設定。

你可以透過撥號方式,概略瞭解裝置上所有正在錄製的錄音檔 AudioManager.getActiveRecordingConfigurations()