動画と音声の再生のキャプチャ

アプリは、別のアプリから再生されている動画や音声を録画できます。そのようなアプリは、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 を追加する必要があります。手順:

  1. AudioPlaybackCaptureConfiguration.Builder.build() を呼び出して AudioPlaybackCaptureConfiguration を作成します。
  2. setAudioPlaybackCaptureConfig を呼び出して、構成を AudioRecord に渡します。

音声キャプチャの制御

アプリは、録画できるコンテンツの種類と、独自の再生を録画できる他のアプリの種類を制御できます。

音声コンテンツによるキャプチャの制限

アプリは次のメソッドを使用して、キャプチャできる音声を制限できます。

addMatchingUsage() メソッドと excludeUsage() メソッドは一緒に使用できません。どちらか一方のみを選択する必要があります。同様に、addMatchingUid()excludeUid() を同時に使用することはできません。

他のアプリによるキャプチャの制限

他のアプリによって音声がキャプチャされないようにアプリを設定できます。アプリの音声は、アプリが次の要件を満たしている場合にのみキャプチャできます。

使用方法

音声を生成するプレーヤーは、その使用状況を USAGE_MEDIAUSAGE_GAME、または USAGE_UNKNOWN に設定しなければなりません。

キャプチャ ポリシー

プレーヤーのキャプチャ ポリシーが AudioAttributes.ALLOW_CAPTURE_BY_ALL である必要があります。これにより、他のアプリに再生のキャプチャを許可します。これはさまざまな方法で設定できます。

これらの前提条件が満たされている場合は、プレーヤーで生成された音声をキャプチャできます。

システム キャプチャの無効化

前述したキャプチャの許可に関する保護が適用されるのはアプリのみです。Android システム コンポーネントは、デフォルトで再生をキャプチャできます。これらのコンポーネントの多くは Android ベンダーによってカスタマイズされており、ユーザー補助やキャプションなどの機能に対応しています。したがって、システムがアプリの再生をキャプチャできるようにすることをおすすめします。システムにアプリの再生をキャプチャされないようにする場合は、キャプチャ ポリシーを ALLOW_CAPTURE_BY_NONE に設定してください。

実行時におけるポリシーの設定

アプリの実行中に AudioManager.setAllowedCapturePolicy() を呼び出してキャプチャ ポリシーを変更できます。メソッドを呼び出したときに MediaPlayer や AudioTrack が再生中でも、音声に影響が及ぶことはありません。ポリシーの変更を有効にするには、プレーヤーまたはトラックを閉じて再度開く必要があります。

ポリシー = マニフェスト + AudioManager + AudioAttributes

キャプチャ ポリシーは複数の場所で指定できるため、有効なポリシーがどのように決定されるかを理解することが重要です。最も制限の厳しいキャプチャ ポリシーが常に適用されます。たとえば、マニフェストに setAllowedCapturePolicy="false" が含まれているアプリは、AudioManager#setAllowedCapturePolicyALLOW_CAPTURE_BY_ALL に設定されていても、システム以外のアプリがその音声をキャプチャすることを許可しません。同様に、AudioManager#setAllowedCapturePolicyALLOW_CAPTURE_BY_ALL に設定され、マニフェストで setAllowedCapturePolicy="true" が設定されているが、メディア プレーヤーの AudioAttributesAudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) でビルドされている場合、このメディア プレーヤーをシステム以外のアプリでキャプチャすることはできません。

次の表は、マニフェスト属性と有効なポリシーによる影響をまとめたものです。

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true すべてのアプリ システムのみ キャプチャなし
false システムのみ システムのみ キャプチャなし