Android 13 では、アプリ ストリーミング機能を使用すると、スマートフォンから接続済みデバイスにアプリをストリーミングし、そのデバイスとアプリの間でやり取りすることができます。新しい COMPANION_DEVICE_APP_STREAMING
ロールを使用すると、アプリは接続済みリモート デバイスのプロキシを作成して管理し、ローカル デバイスからリモート デバイスにアプリをストリーミングできます。COMPANION_DEVICE_APP_STREAMING
ロールを持つアプリは、仮想ディスプレイを作成し、その仮想ディスプレイ上でアプリを起動し、起動したアプリの動画を別のデバイスにストリーミングする権限を取得できます。ロールを保持するアプリは、リモート デバイスが周辺機器として接続されているかのように、リモート デバイスから受け取った入力イベントやマイクイベントをローカル デバイスに挿入することもできます。
アーキテクチャ
Android 13 以降では、新しい仮想デバイス マネージャーとコンパニオン デバイス マネージャー(CDM)が、アプリ ストリーミングやリモートの接続済みデバイスとの通信をサポートするための主要な構成要素となります。
仮想デバイス マネージャー
アプリ ストリーミングは「仮想ディスプレイ」を活用して機能します。仮想デバイス マネージャーは仮想ディスプレイを作成しますが、これは表示可能なプライマリ ディスプレイとは別のものです。ユーザーがアプリのストリーミングを開始することに同意すると、アプリは仮想ディスプレイ上で起動されるか、仮想ディスプレイに転送されます。仮想ディスプレイのコンテンツが、表示先の接続済みデバイスに動画ストリームとして転送されます。
仮想デバイス マネージャーには、VirtualDevice
インスタンスの作成、登録、管理を可能にする API が含まれています。
VirtualDevice
インスタンスは、接続済みデバイスとその機能のプロキシです。VirtualDevice
インスタンスを使用すると、接続済みデバイスは、次の手順で、着信するアプリ ストリームを受信、表示、操作できます。
- 接続済みデバイスのディスプレイに表示することを目的とした
VirtualDisplay
インスタンスを作成します。 - リモートの音声ストリーム(接続済みデバイスのマイクからのストリームなど)をローカル デバイスに挿入して再生します。
- リモートの入力イベント(接続済みデバイスのキーボードからのイベントなど)をローカル デバイスに挿入して再生します。
コンパニオン デバイス マネージャー
CDM は接続状態を管理し、アプリ ストリーミングを有効にするために満たす必要があるロール要件を適用します。
次の図は、アプリ ストリーミング中のローカル デバイスとリモート デバイスのやり取りを示しています。
図 1. アプリ ストリーミング中のローカル デバイスとリモート デバイスのやり取り
コンパニオン アプリ ストリーミング ロールの実装
OEM は、COMPANION_DEVICE_APP_STREAMING
ロールを持つアプリを実装することにより、デバイス上で機能豊富で安全なクロスデバイス エクスペリエンスを実現できます。
仮想デバイスを作成してアプリ ストリーミングを有効にするには、アプリが COMPANION_DEVICE_APP_STREAMING
ロールを保持している必要があります。ロールが付与されると、アプリは CREATE_VIRTUAL_DEVICE
権限を受け取ります。それにより、仮想デバイスを作成できるようになります。ロールを保持するアプリは、接続済みデバイスのプロキシとして機能する VirtualDevice
インスタンスを作成することにより、アプリ ストリーミングを実装することが想定されています。VirtualDevice
クラスは、仮想ディスプレイの合成サーフェスの抽出を可能にするメソッドを提供しており、別のデバイスへのストリーミングに適しています。VirtualDevice
クラスは、リモート デバイスで発生した入力イベントをローカル デバイスに挿入するための API も提供しています。この API を使用すると、ローカル デバイスで実行中のアプリを、リモート デバイス上でネイティブで実行しているように見せることができます。
コンパニオン アプリ ストリーミング ロールを実装する手順は次のとおりです。
マニフェストで
REQUEST_COMPANION_PROFILE_APP_STREAMING
権限をリクエストするアプリを作成します。アプリ ストリーミングを実行する権限をアプリに付与するようユーザーに求めます。
CDM の
AssociationRequest
インスタンスを作成して、COMPANION_DEVICE_APP_STREAMING
ロールをリクエストします。ロールが付与されると、アプリはCREATE_VIRTUAL_DEVICE
権限を受け取ります。VirtualDeviceManager#create()
を呼び出してVirtualDevice
インスタンスを作成します。アプリはVirtualDevice
インスタンスを使用して、仮想ディスプレイと仮想入力を作成し、管理できます。仮想ディスプレイで通知のペンディング インテントを起動し、そのディスプレイの動画キャプチャを作成します。
接続済みデバイスへの接続を作成し、接続済みデバイスに仮想ディスプレイをストリーミングします。
VirtualDevice
API を介して、接続済みデバイスからローカル デバイスに入力イベントを挿入します。ユーザーがリモート デバイスでストリーミング アプリを閉じたら、ストリームを終了して
VirtualDevice
インスタンスを破棄します。この時点では、これまでストリーミングしていたアプリはローカル デバイスでバックグラウンドで実行されており、接続は閉じられます。必要に応じて、接続済みデバイスからの他のシグナルを待って、アプリ ストリーミングを再開します。
アプリは、リモート デバイスへの接続、CDM への接続状態の報告、CDD で規定されているセキュリティ要件の適用を行います。
COMPANION_DEVICE_APP_STREAMING ロールを保持するアプリの要件
CDM は、ユーザーがアプリ ストリーミング アプリをデバイスに関連付けたときに COMPANION_DEVICE_APP_STREAMING
ロールを付与します。このロールはデバイス プロファイルに関連付けられるため、このプロファイルに一致し、Play ストアに追加できるアプリについては、ある程度制御されています。COMPANION_DEVICE_APP_STREAMING
ロールの要件の一覧については、Android のロールをご覧ください。詳しくは、Google の担当者にお問い合わせください。
COMPANION_DEVICE_APP_STREAMING ロールを保持するアプリの機能
COMPANION_DEVICE_APP_STREAMING
ロールでは、アプリ ストリーミングを実行するために、ロールを保持するアプリが以下の機能と動作を備えていることを前提としています。
- 他のデバイスへの接続を作成し、管理する。
- 次のように、信頼できる仮想ディスプレイ(ロック解除されたディスプレイを含む)を作成し、管理する。
- 仮想ディスプレイでアクティビティを開始する。
- 接続済みデバイスのストリーミング対象アプリで発生したイベントをローカル デバイスに挿入する(たとえば、スマートフォンと同じ座標でタブレット上でタッチイベントを再生する)。
- ストリーミング対象アプリから音声データを取得する。
- ストリーミング対象アプリがマイクを使用しているときに、ローカル デバイスのマイク ストリームを接続済みデバイスのマイク ストリームで置き換える。
- ストリーミング対象アプリがカメラを使用しているときに、ローカル デバイスのカメラ ストリームを接続済みデバイスのカメラ ストリームで置き換える。
- ローカル デバイスから接続済みデバイスへの通知の管理とストリーミングを行い、通知に対して操作を行う。
- ローカル デバイスから接続済みデバイスにメタデータ(ローカル デバイスで使用可能なアプリのリストなど)をストリーミングする。
- デバイスの確認をリクエストする。