Wear OS 向け Google アシスタント

スマートウォッチの音声アシスタントを使用すると、外出中の迅速で効率的なシナリオが実現できます。ウェアラブルでの音声操作は動的なものです。つまり、ユーザーは応答を待っている間、デバイスを見ることなく腕時計に話しかけることができます。

Android デベロッパーは、アシスタント App Actions を使用することで、Wear OS アプリを Google アシスタントに拡張できます。「OK Google, ExampleApp でランニングを始めて」などの音声コマンドで、ユーザーをアプリにすばやく誘導できます。

制限事項

Wear のアシスタントは、メディアやワークアウト記録のアクティビティ インタラクションをサポートしています。メディアアプリをアシスタントと統合する方法については、Google アシスタントとメディアアプリをご覧ください。Wear OS アプリでは、次の健康&フィットネス BII がサポートされています。

仕組み

App Actions は、アプリ内機能をアシスタントに拡張し、ユーザーが音声で迅速にアプリの機能を利用できるようにします。アシスタントは、ユーザーがアプリを使用する意思を示すと、そのアプリに登録されている App Actions が shortcuts.xml リソースに含まれているかどうかを確認します。

App Actions は、Android のケーパビリティ要素を使用して shortcuts.xml で記述しています。ケーパビリティ要素は、アプリ ケーパビリティの意味的な説明である組み込みインテント(BII)と、ディープリンク テンプレートなどのフルフィルメントの手順をペアリングしています。Google Play Console を使用してアプリをアップロードすると、shortcuts.xml で宣言されているケーパビリティが Google に登録され、ユーザーがアシスタントからトリガーできるようになります。

App Actions のフロー

上の図は、ユーザーがスタンドアロン アプリでエクササイズを一時停止する様子を示しています。次のステップが発生しています。

  1. ユーザーが特定のウェアラブル アプリに対する音声リクエストをアシスタントに発します。
  2. アシスタントが、事前トレーニング済みのモデル(BII)とリクエストを照合し、クエリから BII でサポートされているパラメータを抽出します。
  3. この例では、アシスタントは PAUSE_EXERCISE BII をクエリと照合し、エクササイズ名パラメータ「hike」を抽出します。
  4. アプリがこの BII の shortcuts.xml ケーパビリティ フルフィルメント定義を介してトリガーされます。
  5. アプリはフルフィルメントを処理し、エクササイズを一時停止します。

接続

App Actions の開発は、Android 搭載デバイス エコシステム内のアプリの機能によって異なります。

  • テザリングあり: ウェアラブル アプリが完全に機能するためにモバイルアプリが必要となる場合、スマートウォッチを通じてアシスタントに行ったユーザークエリはモバイル デバイスで処理されます。このシナリオで適切に機能するには、App Actions フルフィルメント ロジックをモバイルアプリに組み込む必要があります。

  • テザリングなし: ウェアラブル アプリが機能するためにモバイルアプリを必要としない場合、アシスタントはユーザークエリをローカルにスマートウォッチで処理します。このようなリクエストを適切に処理するには、ウェアラブル アプリに App Actions ケーパビリティを組み込む必要があります。

Wear に音声ケーパビリティを追加する

App Actions を Wear OS アプリと統合する手順は次のとおりです。

  1. 音声で有効にするアプリ内機能を、対応する BII と照合します。
  2. メイン アクティビティの AndroidManifest.xml リソースで Android ショートカットのサポートを宣言します。

    <!-- AndroidManifest.xml -->
    <meta-data
        android:name="android.app.shortcuts"
        android:resource="@xml/shortcuts" />
    
  3. AndroidManifest.xml に <intent-filter> 要素を追加します。これで、アシスタントはディープリンクを使用してアプリのコンテンツに接続できます。

  4. shortcuts.xml を作成して、BII のフルフィルメントの詳細を指定します。capability ショートカット要素を使用して、アプリがサポートする BII をアシスタントに対して宣言します。詳しくは、ケーパビリティを追加するをご覧ください。

  5. shortcuts.xml で、選択した BII のケーパビリティを実装します。次のサンプルは、START_EXERCISE BII のケーパビリティを示しています。

    <?xml version="1.0" encoding="utf-8"?>
    <!-- This is a sample shortcuts.xml -->
    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
      <capability android:name="actions.intent.START_EXERCISE">
        <intent
          android:action="android.intent.action.VIEW"
          android:targetPackage="YOUR_UNIQUE_APPLICATION_ID"
          android:targetClass="YOUR_TARGET_CLASS">
          <!-- Eg. name = "Running" -->
          <parameter
            android:name="exercise.name"
            android:key="name"/>
          <!-- Eg. duration = "PT1H" -->
          <parameter
            android:name="exercise.duration"
            android:key="duration"/>
        </intent>
      </capability>
    </shortcuts>
    
  6. 必要に応じて、アプリの機能とコンテンツを表すインライン インベントリを使用して、ユーザー音声のバリエーションに対するサポートを拡大します。

    <capability android:name="actions.intent.START_EXERCISE">
      <intent
        android:targetPackage="com.example.myapp"
        android:targetClass="com.example.myapp.ExerciseActivity">
        <parameter android:name="exercise.name" android:key="exercise" />
      </intent>
    </capability>
    
    <shortcut android:shortcutId="CARDIO_RUN">
      <capability-binding android:key="actions.intent.START_EXERCISE">
        <parameter-binding
          android:key="exercise.name"
          android:value="@array/run_names" />
        </capability-bindig>
    </shortcut>
    
  7. App Actions フルフィルメントの入力を処理するようにアプリのロジックを更新します。

    //FitMainActivity.kt
    
    private fun handleIntent(data: Uri?) {
        var actionHandled = true
        val startExercise = intent?.extras?.getString(START_EXERCISE)
    
        if (startExercise != null){
            val type = FitActivity.Type.find(startExercise)
            val arguments = Bundle().apply {
                putSerializable(FitTrackingFragment.PARAM_TYPE, type)
            }
            updateView(FitTrackingFragment::class.java, arguments)
        }
        else{
            showDefaultView()
            actionHandled = false
        }
        notifyActionSuccess(actionHandled)
    }
    

アプリをプレビュー、テスト、公開する

App Actions には、アプリの審査とテストを行うためのツールが用意されています。詳しくは、Android Studio 用の Google アシスタント プラグインをご覧ください。アプリをテストしてテストリリースを作成すると、App Actions の審査をリクエストしてデプロイできます。一般的なエラー処理のガイダンスについては、次のおすすめの方法をご覧ください。

おすすめの方法

以下のおすすめの方法を沿うことで、アプリをアシスタントと統合する際に優れたユーザー エクスペリエンスを実現します。

ユーザー リクエストに応答する際、リクエストを正常に処理したときも、エラーを通知するときも、触覚や音声フィードバックとともに、対応する確認画面や関連する確認画面を表示します。

基本品質 高品質 最高品質
  • アクティビティから ConfirmationActivity を開始するインテントを作成します。
  • アクティビティから ConfirmationActivity を開始するインテントを作成します。
  • 現在の状態を示すために、チャイムを鳴らし、触覚フィードバックを提供します。
  • アクティビティから ConfirmationActivity を開始するインテントを作成します。
  • テキスト読み上げ(TTS)と触覚フィードバックでエラーか成功かを示します。

一般的なエラーと解決策

以下のエラーの場合は、推奨アプリ ConfirmationActivity のメッセージを使用します。

エラーの場合分け ユーザー操作の例 アプリの応答
アクティビティは実行中 ExerciseName を開始して」
ExerciseName を再開して」
エラーを表示: 「すでに実行中のアクティビティです。」
開始されたアクティビティがない ExerciseName を一時停止 / 停止して」 エラーを表示: 「アクティビティが開始されていません。」
アクティビティの種類が一致しない ExerciseName を一時停止 / 停止して」(ExerciseName は、実行中のアクティビティとは異なる種類のエクササイズ) エラーを表示: 「アクティビティ タイプが一致しません。」
ログインエラー ExerciseName を開始して」(ユーザーがアプリにログインしていないとき) 触覚でユーザーに知らせ、ログイン画面にリダイレクトします。
権限エラー ユーザーに、リクエストされたアクティビティを開始する権限がない。 触覚でユーザーに知らせ、権限リクエスト画面にリダイレクトします。
センサーの問題 ユーザーが、デバイス設定で位置情報サービスをオフにしている。 触覚でユーザーに知らせ、センサーエラーの画面を表示します。次のステップ(省略可):
  • センサー トラッキングなしのアクティビティを開始し、ユーザーに通知します。
  • センサー トラッキングなしのアクティビティを開始するよう、ユーザーの承認をリクエストします。