擷取影片和音訊播放

應用程式可以錄製其他應用程式播放的影片或音訊。這類應用程式必須正確處理 MediaProjection 權杖。本頁面將說明如何操作。此外,本節也說明裝置管理員如何停用錄製任何螢幕快照的功能,以及音訊應用程式如何防止其他應用程式錄製其播放的內容。

如何處理 MediaProjection 權杖

MediaProjection API 可讓應用程式取得 MediaProjection 權杖,藉此獲得一次性存取權,擷取螢幕內容或音訊。Android 作業系統會先徵求使用者同意,再將權杖授予應用程式。

OS 會在快速設定 UI 中顯示有效的 MediaProjection 權杖,並允許使用者隨時撤銷權杖的存取權。發生這種情況時,與工作階段相關聯的虛擬螢幕或音訊串流會停止接收媒體串流。應用程式必須適當回應,否則會繼續錄製無聲的音訊或黑色的影片串流。

如要處理權杖遺失,請使用 registerCallback 方法在 MediaProjection 執行個體上註冊回呼,並在呼叫 onStop 方法時停止錄製。

詳情請參閱「媒體投影」。

錄影

您可以使用 DevicePolicyManager 避免螢幕錄影。如果是公司帳戶 (Android for Work),管理員可以使用 setScreenCaptureDisabled 方法,停用工作資料夾的助理資料收集功能。

程式碼實驗室「管理沒有應用程式的 Android 裝置」說明如何禁止螢幕截圖。

擷取音訊播放

AudioPlaybackCapture API 是在 Android 10 中推出。這個 API 可讓應用程式複製其他應用程式播放的音訊。這項功能類似於螢幕擷取,但適用於音訊。主要用途是讓串流應用程式擷取遊戲播放的音訊。

請注意,AudioPlaybackCapture API 不會影響音訊擷取應用程式的延遲時間。

建構擷取應用程式

為保障安全和隱私,重播擷取功能設有一些限制。 應用程式必須符合下列規定,才能擷取音訊:

如要擷取其他應用程式的音訊,應用程式必須建構 AudioRecord 物件,並在其中加入 AudioPlaybackCaptureConfiguration。步驟如下:

  1. 呼叫 AudioPlaybackCaptureConfiguration.Builder.build() 建構 AudioPlaybackCaptureConfiguration。
  2. 呼叫 setAudioPlaybackCaptureConfig,將設定傳遞至 AudioRecord。

控制音訊擷取

應用程式可以控制可錄製的內容類型,以及其他類型的應用程式可錄製的播放內容。

限制音訊內容擷取

應用程式可以使用下列方法,限制可擷取的音訊:

請注意,您無法同時使用 addMatchingUsage() 和 excludeUsage() 方法。只能擇一。同樣地,您無法同時使用 addMatchingUid() 和 excludeUid()。

限制其他應用程式擷取

您可以設定應用程式,防止其他應用程式擷取其音訊。應用程式必須符合下列規定,系統才能擷取其音訊:

用量

產生音訊的播放器必須將用途設為 USAGE_MEDIA、USAGE_GAME 或 USAGE_UNKNOWN。

擷取政策

播放器的擷取政策必須是 AudioAttributes.ALLOW_CAPTURE_BY_ALL,允許其他應用程式擷取播放內容。做法有下列幾種:

只要符合這些先決條件,系統就能擷取播放器產生的任何音訊。

停用系統擷取功能

上述允許擷取內容的保護措施僅適用於應用程式。根據預設,Android 系統元件可以擷取播放內容。其中許多元件由 Android 供應商自訂,並支援無障礙功能和字幕等功能。因此,建議應用程式允許系統擷取播放內容。在極少數情況下,如果您不希望系統擷取應用程式的播放內容,請將擷取政策設為 ALLOW_CAPTURE_BY_NONE。

在執行階段設定政策

您可以在應用程式執行時呼叫 AudioManager.setAllowedCapturePolicy() 來變更擷取政策。如果呼叫方法時,MediaPlayer 或 AudioTrack 正在播放,音訊不會受到影響。您必須關閉並重新開啟播放器或音軌,政策變更才會生效。

政策 = 資訊清單 + AudioManager + AudioAttributes

由於擷取政策可在多個位置指定,因此請務必瞭解有效政策的決定方式。系統一律會套用最嚴格的擷取政策。舉例來說,如果應用程式的資訊清單包含 setAllowedCapturePolicy="false",即使 AudioManager#setAllowedCapturePolicy 設為 ALLOW_CAPTURE_BY_ALL,也一律不允許非系統應用程式擷取其音訊。同樣地,如果 AudioManager#setAllowedCapturePolicy 設為 ALLOW_CAPTURE_BY_ALL,且資訊清單設定 setAllowedCapturePolicy="true",但媒體播放器的 AudioAttributes 是使用 AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) 建構,則非系統應用程式將無法擷取該媒體播放器。

下表摘要說明資訊清單屬性和有效政策的效果:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true 任何應用程式 僅限系統 不擷取
false 僅限系統 僅限系統 不擷取