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

アプリは、別のアプリから再生されている動画や音声を記録できます。このようなアプリは、MediaProjection トークンを正しく処理する必要があります。このページではその方法について説明します。また、デバイス管理で画面スナップショットの録画機能を無効にする方法と、オーディオ アプリで再生中のコンテンツを他のアプリが録画できないようにする方法についても説明します。

MediaProjection トークンの処理方法

MediaProjection API を使用すると、アプリは MediaProjection トークンを取得できます。このトークンにより、画面コンテンツまたは音声をキャプチャするための 1 回限りのアクセス権が提供されます。Android OS は、トークンをアプリに付与する前に、ユーザーに権限を要求します。

OS のクイック設定 UI にアクティブな MediaProjection トークンが表示され、ユーザーはいつでもトークンへのアクセス権を取り消すことができます。この場合、セッションに関連付けられた仮想ディスプレイまたは音声ストリームは、メディア ストリームの受信を停止します。アプリが適切に応答する必要があります。適切に応答しないと、無音の状態や黒い動画ストリームが録音され続けます。

トークンの損失を処理するには、registerCallback メソッドを使用して MediaProjection インスタンスにコールバックを登録し、onStop メソッドが呼び出されたら記録を停止します。

詳細については、メディア プロジェクションをご覧ください。

動画を撮影

Media Projection API を使用してデバイスの画面をリアルタイムでキャプチャし、SurfaceView に表示する方法については、ScreenCapture サンプルアプリをご覧ください。

DevicePolicyManager を使用すると、画面の録画を防ぐことができます。企業アカウント(Android for Work)の場合、管理者は setScreenCaptureDisabled メソッドを使用して、仕事用プロファイルのアシスタント データの収集を無効にできます。

スクリーンショットを禁止する方法については、Codelab のアプリなしで Android デバイスの管理をご覧ください。

音声再生をキャプチャする

Android 10 で AudioPlaybackCapture API が導入されました。この API を使用すると、他のアプリで再生されている音声をアプリにコピーできます。これはスクリーン キャプチャのアナログ機能ですが、音声のみを対象とします。主なユースケースは、ゲームで再生中の音声をキャプチャするストリーミング アプリです。

AudioPlaybackCapture API は、音声がキャプチャされているアプリのレイテンシには影響を与えません。

キャプチャ アプリのビルド

セキュリティとプライバシーのため、再生キャプチャにはいくつかの制限があります。 音声をキャプチャするには、アプリが次の要件を満たしている必要があります。

  • アプリには RECORD_AUDIO 権限が必要です。
  • アプリは MediaProjectionManager.createScreenCaptureIntent() によって表示されるプロンプトを表示し、ユーザーがそれを承認する必要があります。
  • キャプチャ アプリと再生アプリが同じユーザー プロファイルに含まれている必要があります。

別のアプリから音声をキャプチャするには、アプリで AudioRecord オブジェクトを作成して、AudioPlaybackCaptureConfiguration を追加する必要があります。手順は次のとおりです。

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

音声キャプチャの制御

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

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

アプリは、次の方法でキャプチャできる音声を制限できます。

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

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

他のアプリが音声をキャプチャできないようにアプリを構成できます。 アプリからの音声をキャプチャできるのは、アプリが次の要件を満たしている場合に限られます。

Usage

音声を生成するプレーヤーは、用途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
すべてのアプリ システムのみ キャプチャなし
false システムのみ システムのみ キャプチャなし