アプリは、別のアプリから再生されている動画や音声を録画または録音できます。このようなアプリは、MediaProjection トークンを正しく処理する必要があります。このページでは、その方法について説明します。また、デバイス管理者が画面のスナップショットを記録する機能を無効にする方法と、オーディオ アプリが再生するコンテンツを他のアプリが録音できないようにする方法についても説明します。
MediaProjection トークンの処理方法
MediaProjection API を使用すると、アプリは MediaProjection トークンを取得できます。このトークンにより、画面のコンテンツまたは音声をキャプチャするための 1 回限りのアクセス権が付与されます。Android OS は、アプリにトークンを付与する前に、ユーザーに許可を求めます。
OS は、クイック設定 UI にアクティブな MediaProjection トークンを表示し、ユーザーがいつでもトークンへのアクセスを取り消せるようにします。この場合、セッションに関連付けられている仮想ディスプレイまたは音声ストリームは、メディア ストリームの受信を停止します。アプリは適切に応答する必要があります。そうしないと、音声の無音状態や黒い動画ストリームが録画され続けます。
トークンの損失を処理するには、registerCallback メソッドを使用して MediaProjection インスタンスにコールバックを登録し、onStop メソッドが呼び出されたときに録画を停止します。
詳しくは、メディア プロジェクションをご覧ください。
動画を撮影
DevicePolicyManager を使用すると、画面録画を防止できます。企業アカウント(Android for Work)の場合、管理者は setScreenCaptureDisabled メソッドを使用して、仕事用プロファイルのアシスタント データの収集を無効にできます。
Codelab のアプリを使用せずに Android デバイスを管理するでは、スクリーンショットを禁止する方法を説明しています。
音声再生をキャプチャする
AudioPlaybackCapture API は Android 10 で導入されました。この API を使用すると、アプリは他のアプリで再生されている音声をコピーできます。この機能は、画面キャプチャと似ていますが、音声のみを対象とします。主な使用例は、ゲームで再生中の音声をキャプチャするストリーミング アプリです。
AudioPlaybackCapture API は、音声がキャプチャされているアプリのレイテンシには影響しません。
キャプチャ アプリのビルド
セキュリティとプライバシーを保護するため、プレイバック キャプチャにはいくつかの制限があります。音声をキャプチャするには、アプリが次の要件を満たしている必要があります。
- アプリに
RECORD_AUDIO権限が付与されている。 - アプリは
MediaProjectionManager.createScreenCaptureIntent()によって表示されるプロンプトを表示し、ユーザーはそれを承認する必要があります。 - キャプチャ アプリと再生アプリが同じユーザー プロファイルに含まれている必要があります。
別のアプリから音声をキャプチャするには、アプリで AudioRecord オブジェクトをビルドし、AudioPlaybackCaptureConfiguration を追加する必要があります。手順は次のとおりです。
AudioPlaybackCaptureConfiguration.Builder.build()を呼び出してAudioPlaybackCaptureConfigurationをビルドします。setAudioPlaybackCaptureConfigを呼び出して、構成をAudioRecordに渡します。
音声キャプチャの制御
アプリは、録画できるコンテンツの種類と、独自の再生を録画できる他の種類のアプリを制御できます。
音声コンテンツによるキャプチャの制限
アプリは、次の方法を使用して、キャプチャできる音声を制限できます。
AUDIO_USAGEを AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() に渡して、特定の使用状況のキャプチャを許可します。複数の用途を指定するには、メソッドを複数回呼び出します。AUDIO_USAGEを AudioPlaybackCaptureConfiguration.excludeUsage() に渡して、その用途のキャプチャを禁止します。複数の用途を指定するには、メソッドを複数回呼び出します。- AudioPlaybackCaptureConfiguration.addMatchingUid() に UID を渡して、特定の 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 | システムのみ | システムのみ | キャプチャなし |