Android 6.0(Marshmallow)には、ユーザーがアシスタント経由でアプリを操作できる新しい方法が導入されています。アシスタントは、最前面に表示されるウィンドウで、ユーザーは、現在のアクティビティのコンテキストに関連するアクションを取得できます。取得できるアクションとしは、デバイス上の他のアプリへのディープリンクなどがあります。
アシスタントをアクティブにするには、ホームボタンを長押しするか、キーフレーズを発声します。これにより、コンテキストに関連するアクションを表示するウィンドウが最前面に開きます。
Google アプリは、Android プラットフォーム レベルの機能と連携する Now on Tap 機能を通じて、アシスタント オーバーレイ ウィンドウを実装します。これにより、ユーザーがアシスタント アプリを選択できるようになり、アシスタント アプリは、Android の Assist API を使用して Google アプリからコンテキスト情報を取得します。
このガイドでは、Android アプリが Android の Assist API を使用してアシスタントのユーザー エクスペリエンスを改善する方法について説明します。メディアアプリを作成し、アシスタントを通じて起動や管理を行う方法については、Google アシスタントとメディアアプリをご覧ください。
アシスタントを使用する
アシスタントの標準的なユーザー操作を図 1 に示します。ユーザーがホームボタンを長押しすると、ソースアプリ内で Assist API コールバックが呼び出されます(ステップ 1)。アシスタントが、オーバーレイ ウィンドウをレンダリングし(ステップ 2~3)、ユーザーが、実行するアクションを選択します。アシスタントが、選択されたアクションを実行します。たとえば、レストラン アプリ(デスティネーション)へのディープリンクを持つインテントをトリガーします(ステップ 4)。

図 1: Google アプリの Now on Tap 機能を使用したアシスタント操作の例
アシスタントを設定する場合は、[設定] > [アプリ] > [デフォルト アプリ] > [アシストと音声入力] を選択します。画面コンテンツのテキストへのアクセスや、スクリーンショットの使用などのシステム オプションを変更できます(図 2 を参照)。

図 2: [アシストと音声入力] 設定
ソースアプリ
ユーザー補助に関するベスト プラクティスに従うだけで、アプリ内でアシスタントをユーザーの情報源として使用できるようになります。ここでは、追加情報を提供することにより、アシスタントのユーザー エクスペリエンスを高め、特別な処理を必要とするシナリオ(カスタムビューなど)を改善する方法について説明します。
追加情報をアシスタントと共有する
アプリは、テキストやスクリーンショット以外の情報もアシスタントと共有することができます。たとえば、音楽アプリの場合、現在のアルバム情報をアシスタントに渡すことで、アシスタントは現在のアクティビティに適したスマートなアクションを提案できるようになります。ただし、Assist API ではメディアを操作できない点にご注意ください。メディア コントロールを追加する場合は、Google アシスタントとメディアアプリをご覧ください。
アシスタントに追加情報を提供するには、アプリは、アプリリスナーを登録して、グローバル アプリ コンテキストを提供しつつ、アクティビティ コールバックを使用して、アクティビティ固有の情報を提供します(図 3 を参照)。

図 3: Assist API のライフサイクル シーケンス図
グローバル アプリ コンテキストを提供するには、アプリは、Application.OnProvideAssistDataListener
の実装を作成し、registerOnProvideAssistDataListener()
を使用して登録します。アクティビティ固有のコンテキスト情報を提供するには、アクティビティは、onProvideAssistData()
と onProvideAssistContent()
をオーバーライドします。この 2 つのアクティビティ メソッドは、オプションのグローバル コールバックが呼び出された後に呼び出されます。コールバックはメインスレッド上で実行されるため、すぐに完了します。コールバックが呼び出されるのは、アクティビティの実行中に限られます。
コンテキストを提供する
ユーザーがアシスタントをアクティブにすると、onProvideAssistData()
が呼び出され、AssistStructure
のインスタンスとして表現される現在のアプリのコンテキストをすべて含む完全な ACTION_ASSIST
インテントが作成されます。このメソッドをオーバーライドして、バンドル内に独自の情報を追加すると、アシスト インテントの EXTRA_ASSIST_CONTEXT
の部分に表示させることができます。
コンテンツについて説明する
アプリに onProvideAssistContent()
を実装すると、現在のアクティビティに関するコンテンツ関連参照を提供できるようになり、アシスタントのユーザー エクスペリエンスを改善できます。Schema.org によって定義されている共通言語を、JSON-LD オブジェクト経由で使用することで、アプリ コンテンツについて説明することができます。次の例では、ユーザーが現在参照している音楽アルバムを説明する構造化データが音楽アプリから提供されます。
Kotlin
override fun onProvideAssistContent(assistContent: AssistContent) { super.onProvideAssistContent(assistContent) val structuredJson: String = JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString() assistContent.structuredData = structuredJson }
Java
@Override public void onProvideAssistContent(AssistContent assistContent) { super.onProvideAssistContent(assistContent); String structuredJson = new JSONObject() .put("@type", "MusicRecording") .put("@id", "https://example.com/music/recording") .put("name", "Album Title") .toString(); assistContent.setStructuredData(structuredJson); }
また、onProvideAssistContent()
をカスタム実装することでユーザー エクスペリエンスを向上させることもできます。この方法には以下のようなメリットがあります。
- 提供するコンテンツ インテントを調整して、アクティビティにとって最も重要なコンテキストを適切に反映することができます。
- 表示されるコンテンツの URI を提供できます。
- ユーザーが現在表示している対象の追加コンテンツを
setClipData()
に入力できます。
注: テキスト選択のカスタム実装を使用するアプリは通常、onProvideAssistContent()
を実装して setClipData()
を呼び出す必要があります。
デフォルト実装
onProvideAssistData()
と onProvideAssistContent()
のいずれのコールバックも実装されていない場合でも、現在のウィンドウのセキュアフラグがオンになっていなければ、システムは処理を続行し、収集した情報を自動的にアシスタントに渡します。図 3 に示すように、システムは onProvideStructure()
と onProvideVirtualStructure()
のデフォルト実装を使用して、テキスト / ビュー階層の情報を収集します。ビューがカスタム テキスト描画を実装している場合は、setText(CharSequence)
を呼び出すことで、onProvideStructure()
をオーバーライドし、ユーザーに表示するテキストをアシスタントに提供できるようにます。
ほとんどの場合、ユーザー補助サポートを実装することで、アシスタントは、必要な情報を取得できるようになります。ユーザー補助サポートを実装する方法については、アプリのユーザー補助機能を強化するをご覧ください。たとえば、以下のようなベスト プラクティスが記載されています。
android:contentDescription
属性を指定します。- カスタムビュー用に
AccessibilityNodeInfo
を設定します。 - カスタム
ViewGroup
オブジェクトが子オブジェクトを適切にエクスポーズするように設定します。
ビューをアシスタントの対象から除外する
機密情報を扱う場合、WindowManager
の FLAG_SECURE
レイアウト パラメータを設定することで、アプリは、現在のビューをアシスタントの対象から除外できるようになります。アクティビティによって作成されたすべてのウィンドウ(ダイアログを含む)に対して明示的に FLAG_SECURE
を設定する必要があります。また、アプリは、setSecure()
を使用することで、サーフェスをアシスタントの対象から除外することもできます。すべてのビューをアシスタントの対象から除外するグローバル(アプリレベル)メカニズムはありません。FLAG_SECURE
を設定しても、Assist API コールバックのトリガーが停止することはありません。FLAG_SECURE
を使用するアクティビティは引き続き、このガイドで説明しているコールバックを使用して、明示的にアシスタントに情報を提供することができます。
注: エンタープライズ アカウント(Android for Work)の場合、管理者は、DevicePolicyManager
API の setScreenCaptureDisabled()
メソッドを使用することで、仕事用プロファイルを対象とするアシスタント データの収集を無効にすることができます。
音声操作
Assist API コールバックは、キーフレーズの検出時にも呼び出されます。詳細については、音声操作をご覧ください。
Z オーダーに関する注意事項
アシスタントは、現在のアクティビティの上に表示される軽量のオーバーレイ ウィンドウを使用します。ユーザーはアシスタントをいつでもアクティブにできるため、オーバーレイ ウィンドウの妨げになる永続的なシステム アラート ウィンドウは作成しないでください(図 4 を参照)。

図 4: アシストレイヤの Z オーダー
アプリがシステム アラート ウィンドウを使用する場合は、速やかに取り除くようにしてください。画面上にアラート ウィンドウを表示したままにすると、ユーザー エクスペリエンスが低下します。
デスティネーション アプリ
アシスタントは通常、デスティネーション アプリを見つけるためにディープリンクを利用します。アプリをデスティネーション アプリとして選択できるようにするには、ディープリンク サポートを追加することをおすすめします。現在のユーザー コンテキストと、オーバーレイ ウィンドウに表示されるディープリンクなどのアクション(図 1 のステップ 3 を参照)との間のマッチングは、アシスタントの実装に固有のものです。たとえば、Google アプリの場合、トラフィックをデスティネーション アプリに誘導するために、ディープリンクと Firebase App Indexing を使用します。
独自のアシスタントを実装する
独自のアシスタントを実装することも可能です。図 2 に示すように、ユーザーは、アクティブにするアシスタント アプリを選択できます。こちらの VoiceInteraction
サンプルに示すように、アシスタント アプリは、VoiceInteractionSessionService
と VoiceInteractionSession
を実装する必要があります。また、BIND_VOICE_INTERACTION
パーミッションも必要です。アシスタントは、AssistStructure
のインスタンスとして表現されるテキスト / ビュー階層を、onHandleAssist()
内で受け取ることができます。また、onHandleScreenshot()
経由でスクリーンショットを受け取ります。