アプリは、別のアプリから再生されている動画や音声を記録できます。このようなアプリは、MediaProjection
トークンを正しく処理する必要があります。このページでは、その方法について説明します。また、デバイス管理で画面スナップショットの録画機能を無効にする方法と、オーディオ アプリで再生中のコンテンツを他のアプリが録画できないようにする方法についても説明します。
MediaProjection
トークンを処理する方法
MediaProjection
API を使用すると、アプリは MediaProjection
トークンを取得できます。このトークンにより、画面のコンテンツや音声をキャプチャするための 1 回限りのアクセス権が付与されます。Android OS は、アプリにトークンを付与する前にユーザーに権限を求めます。
OS は、アクティブな MediaProjection
トークンをクイック設定 UI に表示し、ユーザーはトークンへのアクセス権をいつでも取り消すことができます。この場合、セッションに関連付けられた仮想ディスプレイまたは音声ストリームは、メディア ストリームの受信を停止します。アプリが適切に応答する必要があります。適切に応答しないと、無音の状態や黒い動画ストリームが録音され続けます。
トークンの損失を処理するには、registerCallback
メソッドを使用して MediaProjection
インスタンスにコールバックを登録し、onStop
メソッドが呼び出されたときに録画を停止します。
詳しくは、メディア プロジェクションをご覧ください。
動画を撮影
Media Projection API を使用してデバイスの画面をリアルタイムでキャプチャし、SurfaceView に表示する方法については、ScreenCapture サンプルアプリをご覧ください。
DevicePolicyManager
を使用すると、画面の録画を防ぐことができます。エンタープライズ アカウント(Android for Work)の場合、管理者は setScreenCaptureDisabled メソッドを使用して、仕事用プロファイルのアシスタント データの収集を無効にできます。
アプリを使用しない Android デバイスの管理の Codelab では、スクリーンショットを禁止する方法について説明しています。
音声再生をキャプチャする
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
キャプチャ ポリシーは複数の場所で指定できるため、有効なポリシーを決定する方法を理解することが重要です。最も制限の厳しいキャプチャ ポリシーが常に適用されます。たとえば、マニフェストに 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 | システムのみ | システムのみ | キャプチャなし |