應用程式可以錄製從其他應用程式播放的影片或音訊。這類應用程式必須正確處理 MediaProjection
權杖。本頁面將說明相關做法。這也會顯示裝置管理員如何停用錄製任何螢幕畫面快照的功能,以及音訊應用程式如何防止其他應用程式錄製播放的內容。
如何處理 MediaProjection
權杖
MediaProjection
API 可讓應用程式取得 MediaProjection
權杖,以便一次性擷取畫面內容或音訊。Android 作業系統在將權杖授予應用程式之前,會先要求使用者授予權限。
OS 會在快速設定 UI 中顯示有效的 MediaProjection
權杖,讓使用者隨時撤銷權杖存取權。此時,與工作階段相關聯的虛擬螢幕或音訊串流會停止接收媒體串流。應用程式必須適當回應,否則會繼續錄製音訊靜音或黑色影片串流。
如要處理權杖遺失的問題,請使用 registerCallback
方法在 MediaProjection
例項上註冊回呼,並在呼叫 onStop
方法時停止記錄。
詳情請參閱「媒體投影」。
錄影
請參閱 ScreenCapture 範例應用程式,瞭解如何使用 Media Projection API 即時擷取裝置的螢幕畫面,並在 SurfaceView 上顯示。
您可以使用 DevicePolicyManager
來防止螢幕錄影。如果是企業帳戶 (Android for Work),管理員可以使用 setScreenCaptureDisabled 方法,停用工作資料夾的 Google 助理資料收集功能。
在程式碼研究室「沒有應用程式的情況下管理 Android 裝置」一文說明如何禁止擷取螢幕截圖。
擷取音訊播放
AudioPlaybackCapture API 在 Android 10 中推出。此 API 可讓應用程式複製其他應用程式播放的音訊。這項功能是螢幕擷取的類比,但適用於音訊。主要用途是想擷取遊戲播放音訊的串流應用程式。
請注意,AudioPlaybackCapture API 不會影響擷取音訊的應用程式延遲時間。
建構拍攝應用程式
為保護安全和隱私,播放擷取會有一些限制。 應用程式必須符合下列需求,才能擷取音訊:
- 應用程式必須具備
RECORD_AUDIO
權限。 - 應用程式必須顯示
MediaProjectionManager.createScreenCaptureIntent()
顯示的提示,而且使用者必須核准。 - 擷取和播放的應用程式必須屬於同一個使用者設定檔。
如要從其他應用程式擷取音訊,您的應用程式必須建構 AudioRecord
物件,並為其加入 AudioPlaybackCaptureConfiguration
。請按照下列步驟操作:
- 呼叫
AudioPlaybackCaptureConfiguration.Builder.build()
以建構AudioPlaybackCaptureConfiguration
。 - 呼叫
setAudioPlaybackCaptureConfig
,將設定傳遞至AudioRecord
。
控制音訊擷取
應用程式可以控制可以錄製的內容類型,以及哪些應用程式可以錄製自己的播放內容。
限制音訊內容擷取
應用程式可以使用以下方法,限制可擷取的音訊內容:
- 將
AUDIO_USAGE
傳遞至 AudioPlaybackCaptureConfiguration.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
由於擷取政策可以在多個位置指定,因此請務必瞭解決定生效政策的方式。系統會一律套用最嚴格的擷取政策。舉例來說,即使 AudioManager#setAllowedCapturePolicy
設為 ALLOW_CAPTURE_BY_ALL
,如果應用程式的資訊清單包含 setAllowedCapturePolicy="false"
,就一律不允許非系統應用程式擷取其音訊。同樣地,如果 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 | 僅限系統 | 僅限系統 | 不擷取 |