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