擷取影片和音訊播放

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

如何處理 MediaProjection 權杖

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

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

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

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

錄影

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

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

程式碼研究室「 Managing Android Devices Without an App」 說明如何禁止螢幕截圖。

擷取音訊播放

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) 建構,則非系統應用程式無法擷取這個媒體播放器。

下表歸納了資訊清單屬性和有效政策的影響:

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