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

Android 6.0 Marshmallow では、ユーザーが Google アシスタントなどのアシスタント アプリを使ってアプリを操作する新しい方法が導入されています。アシスタントは、ユーザーが現在のアクティビティのコンテキストに応じたアクションを取得できる最上位のウィンドウです。これらのアクションには、デバイス上の他のアプリへのディープリンクが含まれることもあります。

ユーザーがアシスタントを起動するには、ホームボタンを長押しするか、キーフレーズを言います。それに応じて、コンテキストに応じたアクションを表示する最上位ウィンドウが開きます。

Google アシスタントなどのアシスタント アプリは、Android プラットフォーム レベルの機能と連携する Now on Tap という機能を通じて、アシスタント オーバーレイ ウィンドウを実装します。ユーザーはアシスタント アプリを選択できます。アシスタント アプリは、Android の Assist API を使用してアプリからコンテキスト情報を取得します。

このガイドでは、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() が呼び出されて、完全な ACTION_ASSIST インテントがビルドされます。このインテントには、AssistStructure のインスタンスとして表される現在のアプリのすべてのコンテキストが含まれます。このメソッドをオーバーライドして、任意のバンドル内に配置して、アシスト インテントの 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() のデフォルト実装を使用して、テキストとビューの階層情報を収集します。ビューにカスタム テキスト描画が実装されている場合は、onProvideStructure() をオーバーライドし、setText(CharSequence) を呼び出して、ユーザーに表示するテキストをアシスタントに提供します。

ほとんどの場合、ユーザー補助サポートを実装することで、アシスタントは必要な情報を取得できます。ユーザー補助サポートを実装するには、アプリのユーザー補助機能を強化するで説明している、次のようなおすすめの方法に従ってください。

アシスタントからのビューの除外

機密情報を処理するには、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 パーミッションも必要です。アシスタントは、AssistStructure のインスタンスとして表されるテキストとビューの階層を onHandleAssist() で受け取ることができます。onHandleScreenshot() を介してスクリーンショットを受け取ります。