擷取影片和音訊播放

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

如何處理 MediaProjection 權杖

MediaProjection API 可讓應用程式取得 MediaProjection 權杖,提供一次性存取擷取畫面內容或音訊的權限。Android 作業系統會要求使用者提供權限,然後再將權杖授予應用程式。

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

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

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

錄影

請參閱 ScreenCapture 範例應用程式,瞭解如何使用 Media Projection API 即時擷取裝置畫面,並在 SurfaceView 上顯示。

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

程式碼研究室「管理不含應用程式的 Android 裝置」一文說明瞭如何禁止擷取螢幕截圖。

擷取音訊播放

Android 10 導入了 AudioPlaybackCapture API。這個 API 可讓應用程式複製其他應用程式播放的音訊。這項功能與螢幕畫面擷取類似,但用於音訊。主要用途是串流應用程式,用於擷取遊戲播放的音訊。

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

建構擷取應用程式

基於安全和隱私考量,播放擷取功能會有一些限制。 應用程式必須符合下列條件,才能擷取音訊:

如要從其他應用程式擷取音訊,應用程式必須建構 AudioRecord 物件,並為其新增 AudioPlaybackCaptureConfiguration。請按照下列步驟操作:

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

控管音訊擷取

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

依據音訊內容限制擷取的內容

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

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

限制其他應用程式擷取內容

您可以設定應用程式,防止其他應用程式擷取其音訊。如要擷取應用程式的音訊,應用程式必須符合以下要求:

使用方式

產生音訊的播放器必須將用途設為 USAGE_MEDIAUSAGE_GAMEUSAGE_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) 建構,那麼非系統應用程式就無法使用這個媒體播放器。

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

允許音訊播放擷取 ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true 任何應用程式 僅限系統 不擷取
false 僅限系統 僅限系統 不擷取