アシスタント用にコンテキスト コンテンツを最適化する

Android 6.0 Marshmallow には、ユーザーがGoogle アシスタントなどのアシスタント アプリを介してアプリを操作できる新しい方法が導入されています。アシスタントは、ユーザーが現在のアクティビティのコンテキストに関連するアクションを取得するために表示できるトップレベル ウィンドウです。取得できるアクションとしは、デバイス上の他のアプリへのディープリンクなどがあります。

アシスタントを起動するには、ホームボタンを長押しするか、キーフレーズを言います。 これにより、コンテキストに関連するアクションを表示するウィンドウが最前面に開きます。

Google アシスタントなどのアシスタント アプリは、Now on Tap と呼ばれる機能を使用してアシスタント オーバーレイ ウィンドウを実装します。この機能は Android プラットフォーム レベルの機能と連携します。これにより、ユーザーがアシスタント アプリを選択できるようになり、アシスタント アプリは、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() を実装すると、現在のアクティビティに関するコンテンツ関連参照を提供できるようになり、アシスタントのユーザー エクスペリエンスを改善できます。JSON-LD オブジェクトを使用して Schema.org で定義されている共通語彙を使用して、アプリのコンテンツを記述できます。次の例では、ユーザーが現在参照している音楽アルバムを説明する構造化データが音楽アプリから提供されます。

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() をカスタム実装することでユーザー エクスペリエンスを向上させることもできます。この方法には以下のようなメリットがあります。

注: テキスト選択のカスタム実装を使用するアプリは通常、onProvideAssistContent() を実装して setClipData() を呼び出す必要があります。

デフォルト実装

onProvideAssistData()onProvideAssistContent() のいずれのコールバックも実装されていない場合でも、現在のウィンドウのセキュアフラグがオンになっていなければ、システムは処理を続行し、収集した情報を自動的にアシスタントに渡します。図 3 に示すように、システムは onProvideStructure()onProvideVirtualStructure() のデフォルト実装を使用して、テキスト / ビュー階層の情報を収集します。ビューがカスタム テキスト描画を実装している場合は、setText(CharSequence) を呼び出すことで、onProvideStructure() をオーバーライドし、ユーザーに表示するテキストをアシスタントに提供できるようにします。

ほとんどの場合、ユーザー補助サポートを実装することで、アシスタントは、必要な情報を取得できるようになります。ユーザー補助サポートを実装する方法については、アプリのユーザー補助機能を強化するをご覧ください。たとえば、以下のようなベスト プラクティスが記載されています。

アシスタントの視聴回数を除外する

機密情報を扱う場合、アプリで WindowManagerFLAG_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 アシスタントの実装に固有のものです。たとえば、Google アシスタント アプリは、トラフィックをデスティネーション アプリに誘導するために、ディープリンクとアプリリンクを使用します。

独自のアシスタントを実装する

独自のアシスタントを実装することも可能です。図 2 に示すように、ユーザーは、アクティブにするアシスタント アプリを選択できます。こちらの VoiceInteraction サンプルに示すように、アシスタント アプリは、VoiceInteractionSessionServiceVoiceInteractionSession を実装する必要があります。また、BIND_VOICE_INTERACTION パーミッションも必要です。アシスタントは、onHandleAssist()AssistStructure のインスタンスとして表現されるテキスト / ビュー階層を受け取ることができます。onHandleScreenshot() を介してスクリーンショットを受け取ります。