コンパニオン アプリのストリーミング

Android 13 では、アプリ ストリーミング機能を使用すると、スマートフォンから接続済みデバイスにアプリをストリーミングし、そのデバイスとアプリの間でやり取りすることができます。新しい COMPANION_DEVICE_APP_STREAMING ロールを使用すると、アプリは接続済みリモート デバイスのプロキシを作成して管理し、ローカル デバイスからリモート デバイスにアプリをストリーミングできます。COMPANION_DEVICE_APP_STREAMING ロールを持つアプリは、仮想ディスプレイを作成し、その仮想ディスプレイ上でアプリを起動し、起動したアプリの動画を別のデバイスにストリーミングする権限を取得できます。ロールを保持するアプリは、リモート デバイスが周辺機器として接続されているかのように、リモート デバイスから受け取った入力イベントやマイクイベントをローカル デバイスに挿入することもできます。

アーキテクチャ

Android 13 以降では、新しい仮想デバイス マネージャーコンパニオン デバイス マネージャー(CDM)が、アプリ ストリーミングやリモートの接続済みデバイスとの通信をサポートするための主要な構成要素となります。

仮想デバイス マネージャー

アプリ ストリーミングは「仮想ディスプレイ」を活用して機能します。仮想デバイス マネージャーは仮想ディスプレイを作成しますが、これは表示可能なプライマリ ディスプレイとは別のものです。ユーザーがアプリのストリーミングを開始することに同意すると、アプリは仮想ディスプレイ上で起動されるか、仮想ディスプレイに転送されます。仮想ディスプレイのコンテンツが、表示先の接続済みデバイスに動画ストリームとして転送されます。

仮想デバイス マネージャーには、VirtualDevice インスタンスの作成、登録、管理を可能にする API が含まれています。

VirtualDevice インスタンスは、接続済みデバイスとその機能のプロキシです。VirtualDevice インスタンスを使用すると、接続済みデバイスは、次の手順で、着信するアプリ ストリームを受信したり、表示したり、操作したりできます。

  • 接続済みデバイスのディスプレイに表示することを目的とした VirtualDisplay インスタンスを作成します。
  • リモートの音声ストリーム(接続済みデバイスのマイクからのストリームなど)をローカル デバイスに挿入して再生します。
  • リモートの入力イベント(接続済みデバイスのキーボードからのイベントなど)をローカル デバイスに挿入して再生します。

コンパニオン デバイス マネージャー

CDM は接続状態を管理し、アプリ ストリーミングを有効にするために満たす必要があるロール要件を適用します。

次の図は、アプリ ストリーミング中のローカル デバイスとリモート デバイスのやり取りを示しています。

app-streaming-interaction

図 1. アプリ ストリーミング中のローカル デバイスとリモート デバイスのやり取り

コンパニオン アプリ ストリーミング ロールの実装

OEM は、COMPANION_DEVICE_APP_STREAMING ロールを持つアプリを実装することにより、デバイス上で機能豊富で安全なクロスデバイス エクスペリエンスを実現できます。

仮想デバイスを作成してアプリ ストリーミングを有効にするには、アプリが COMPANION_DEVICE_APP_STREAMING ロールを保持している必要があります。ロールが付与されると、アプリは CREATE_VIRTUAL_DEVICE 権限を受け取ります。それにより、仮想デバイスを作成できるようになります。ロールを保持するアプリは、接続済みデバイスのプロキシとして機能する VirtualDevice インスタンスを作成することにより、アプリ ストリーミングを実装することが想定されています。VirtualDevice クラスは、仮想ディスプレイの合成サーフェスの抽出を可能にするメソッドを提供しており、別のデバイスへのストリーミングに適しています。VirtualDevice クラスは、リモート デバイスで発生した入力イベントをローカル デバイスに挿入するための API も提供しています。この API を使用すると、ローカル デバイスで実行中のアプリを、リモート デバイス上でネイティブで実行しているように見せることができます。

コンパニオン アプリ ストリーミング ロールを実装する手順は次のとおりです。

  1. マニフェストで REQUEST_COMPANION_PROFILE_APP_STREAMING 権限をリクエストするアプリを作成します。

  2. アプリ ストリーミングを実行する権限をアプリに付与するようユーザーに求めます。

  3. CDM の AssociationRequest インスタンスを作成して、COMPANION_DEVICE_APP_STREAMING ロールをリクエストします。ロールが付与されると、アプリは CREATE_VIRTUAL_DEVICE 権限を受け取ります。

  4. VirtualDeviceManager#create() を呼び出して VirtualDevice インスタンスを作成します。アプリは VirtualDevice インスタンスを使用して、仮想ディスプレイと仮想入力を作成し、管理できます。

  5. 仮想ディスプレイで通知のペンディング インテントを起動し、そのディスプレイの動画キャプチャを作成します。

  6. 接続済みデバイスへの接続を作成し、接続済みデバイスに仮想ディスプレイをストリーミングします。

  7. VirtualDevice API を介して、接続済みデバイスからローカル デバイスに入力イベントを挿入します。

  8. ユーザーがリモート デバイスでストリーミング アプリを閉じたら、ストリームを終了して VirtualDevice インスタンスを破棄します。この時点では、これまでストリーミングしていたアプリはローカル デバイスでバックグラウンドで実行されており、接続は閉じられます。

  9. 必要に応じて、接続済みデバイスからの他のシグナルを待って、アプリ ストリーミングを再開します。

アプリは、リモート デバイスへの接続、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 ロールでは、アプリ ストリーミングを実行するために、ロールを保持するアプリが以下の機能と動作を備えていることを前提としています。

  • 他のデバイスへの接続を作成し、管理する。
  • 次のように、信頼できる仮想ディスプレイ(ロック解除されたディスプレイを含む)を作成し、管理する。
    • 仮想ディスプレイでアクティビティを開始する。
    • 接続済みデバイスのストリーミング対象アプリで発生したイベントをローカル デバイスに挿入する(たとえば、スマートフォンと同じ座標でタブレット上でタッチイベントを再生する)。
    • ストリーミング対象アプリから音声データを取得する。
    • ストリーミング対象アプリがマイクを使用しているときに、ローカル デバイスのマイク ストリームを接続済みデバイスのマイク ストリームで置き換える。
    • ストリーミング対象アプリがカメラを使用しているときに、ローカル デバイスのカメラ ストリームを接続済みデバイスのカメラ ストリームで置き換える。
  • ローカル デバイスから接続済みデバイスへの通知の管理とストリーミングを行い、通知に対して操作を行う。
  • ローカル デバイスから接続済みデバイスにメタデータ(ローカル デバイスで使用可能なアプリのリストなど)をストリーミングする。
  • デバイスの確認をリクエストする。