應用程式可以錄製其他應用程式播放的影片或音訊。這類應用程式必須正確處理 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 不會影響音訊擷取應用程式的延遲時間。
建構擷取應用程式
為保障安全和隱私,重播擷取功能設有一些限制。 應用程式必須符合下列規定,才能擷取音訊:
- 應用程式必須具備
RECORD_AUDIO權限。 - 應用程式必須顯示
MediaProjectionManager.createScreenCaptureIntent()顯示的提示,且使用者必須核准。 - 擷取和播放應用程式必須位於同一個使用者個人資料中。
如要擷取其他應用程式的音訊,應用程式必須建構 AudioRecord 物件,並在其中加入 AudioPlaybackCaptureConfiguration。步驟如下:
- 呼叫
AudioPlaybackCaptureConfiguration.Builder.build()建構AudioPlaybackCaptureConfiguration。 - 呼叫
setAudioPlaybackCaptureConfig,將設定傳遞至AudioRecord。
控制音訊擷取
應用程式可以控制可錄製的內容類型,以及其他類型的應用程式可錄製的播放內容。
限制音訊內容擷取
應用程式可以使用下列方法,限制可擷取的音訊:
- 將
AUDIO_USAGE傳遞至 AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage(),允許擷取特定用途。多次呼叫這個方法,即可指定多個用途。 - 將
AUDIO_USAGE傳遞至 AudioPlaybackCaptureConfiguration.excludeUsage(),禁止擷取該用途。多次呼叫這個方法,即可指定多個用途。 - 將 UID 傳遞至 AudioPlaybackCaptureConfiguration.addMatchingUid(),即可只擷取具有特定 UID 的應用程式。多次呼叫這個方法,即可指定多個 UID。
- 將 UID 傳遞至 AudioPlaybackCaptureConfiguration.excludeUid(),禁止擷取該 UID。多次呼叫這個方法,即可指定多個 UID。
請注意,您無法同時使用 addMatchingUsage() 和 excludeUsage() 方法。只能擇一。同樣地,您無法同時使用 addMatchingUid() 和 excludeUid()。
限制其他應用程式擷取
您可以設定應用程式,防止其他應用程式擷取其音訊。應用程式必須符合下列規定,系統才能擷取其音訊:
用量
產生音訊的播放器必須將用途設為 USAGE_MEDIA、USAGE_GAME 或 USAGE_UNKNOWN。
擷取政策
播放器的擷取政策必須是 AudioAttributes.ALLOW_CAPTURE_BY_ALL,允許其他應用程式擷取播放內容。做法有下列幾種:
- 如要為所有播放器啟用擷取功能,請在應用程式的
manifest.xml檔案中加入android:allowAudioPlaybackCapture="true"。 - 您也可以呼叫
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL),為所有播放器啟用擷取功能。 - 使用
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)建構個別播放器時,可以設定政策。(如果您使用的是AAudio,請呼叫AAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_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 | 僅限系統 | 僅限系統 | 不擷取 |