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)。
ユーザーは、[設定] > [アプリ] > [デフォルト アプリ] > [アシストと音声入力] を選択してアシスタントを構成できます。図 2 に示すように、画面コンテンツのテキストへのアクセス、スクリーンショットの使用などのシステム オプションを変更できます。
ソースアプリ
ユーザー補助に関するおすすめの方法に従うだけで、アプリでアシスタントをユーザーの情報源として使用できるようになります。ここでは、アシスタントのユーザー エクスペリエンスの向上や特別な処理を必要とするシナリオ(カスタムビューなど)の改善に役立つ追加情報を提供する方法について説明します。
追加情報をアシスタントと共有する
アプリは、テキストやスクリーンショット以外の情報もアシスタントと共有することができます。たとえば、音楽アプリの場合、現在のアルバム情報をアシスタントに渡すことで、アシスタントは現在のアクティビティに適したスマートなアクションを提案できるようになります。なお、Assist API ではメディアを操作できない点にご注意ください。メディア コントロールを追加するには、 Google アシスタントとメディアアプリをご覧ください。
アシスタントに追加情報を提供するには、図 3 に示すように、アプリでアプリリスナーを登録してグローバル アプリ コンテキストを提供し、アクティビティ コールバックを使ってアクティビティ固有の情報を提供します。
グローバル アプリ コンテキストを提供するには、アプリは、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()
をカスタム実装することでユーザー エクスペリエンスを向上させることもできます。この方法には以下のようなメリットがあります。
- 提供されたコンテンツ インテントを調整して、アクティビティにとって最も重要なコンテキストを適切に反映することができます。
- 表示されるコンテンツの 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 に示すように、オーバーレイ ウィンドウの妨げになる永続的な システム アラート ウィンドウは作成しないでください。
アプリでシステム アラート ウィンドウを使用する場合は、速やかに削除してください。このウィンドウを画面上に表示したままにすると、ユーザー エクスペリエンスが低下します。
デスティネーション アプリ
アシスタント アプリは通常、リンク先のアプリを見つけるためにディープリンクを利用します。アプリをデスティネーション アプリとして選択できるようにするには、ディープリンク サポートを追加することをおすすめします。現在のユーザー コンテキストと、オーバーレイ ウィンドウに表示されるディープリンクなどの潜在的なアクション(図 1 のステップ 3 を参照)とのマッチングは、Google アシスタントの実装に固有のものです。たとえば、Google アシスタント アプリは、トラフィックをデスティネーション アプリに誘導するために、ディープリンクとアプリリンクを使用します。
独自のアシスタントを実装する
独自のアシスタントを実装することも可能です。図 2 に示すように、ユーザーは、アクティブにするアシスタント アプリを選択できます。こちらの VoiceInteraction
サンプルに示すように、アシスタント アプリは、VoiceInteractionSessionService
と VoiceInteractionSession
を実装する必要があります。また、BIND_VOICE_INTERACTION
パーミッションも必要です。アシスタントは、onHandleAssist()
の AssistStructure
のインスタンスとして表現されるテキスト / ビュー階層を受け取ることができます。onHandleScreenshot()
を介してスクリーンショットを受け取ります。