開発者コンソール

手順7: BroadcastReceiverを追加する


手順7: BroadcastReceiverを追加する

マニフェストにBroadcastReceiverを追加すると、指定したBroadcastReceiverクラス(AlexaDirectiveReceiverなど)に、アプリへのAlexaディレクティブを含むインテントがFire TVから送信されるようになります。このBroadcastReceiverクラスで、Alexaからアプリに送信されるディレクティブを受け取り、処理します。

サンプルアプリに関する注意事項

サンプルアプリのレポートにはBroadcastReceiverがあるため、この手順でコーディングを行う必要はありません。サンプルアプリでは、BroadcastReceiverはAlexaDirectiveReceiverという名前になっています(java/com/example/vskfiretv/company/receiverにあります)。

マニフェストでのBroadcastReceiverとインテントフィルターの宣言

Fire TVのVSK Agentは、アプリが受け取るインテントにディレクティブを含めて送信します。アプリのマニフェストでは、VSK AgentからのAlexaディレクティブやその他の機能レポートを処理するためのBroadcastReceiverとインテントフィルターを宣言します。このBroadcastReceiverは、インテントフィルターACTION_ALEXA_DIRECTIVEおよびACTION_REPORT_CAPABILITIESを処理します。

次のマニフェストの例では、BroadcastReceiverの名前はAlexaDirectiveReceiverとなっています。サンプルアプリでは、このようにBroadcastReceiverに名前が付けられています。この名前を変更して、アプリで使用するBroadcastReceiverの名前を指定します。

   <receiver
       android:name=".receiver.AlexaDirectiveReceiver"
       android:enabled="true"
       android:exported="true"
       android:permission="com.amazon.alexa.androidapplicationagent.permission.SEND_DATA">
       <!-- Alexaディレクティブの受信に対するインテントアクション -->
       <intent-filter>
           <action android:name="com.amazon.alexa.vsk_app_agent_api.ACTION_ALEXA_DIRECTIVE" />
       </intent-filter>
       <!-- VSK Agentからリクエストされたアプリの動的機能を報告するためのインテントアクション -->
       <intent-filter>
           <action android:name="com.amazon.alexa.vsk_app_agent_api.ACTION_REPORT_CAPABILITIES" />
       </intent-filter>
   </receiver>
サンプルアプリに関する注意事項

BroadcastReceiverとインテントフィルターを宣言する方法の例については、サンプルアプリのAndroidManifest.xmlapp/srcにあります)を参照してください。

BroadcastReceiver Javaクラスの追加

VSK Agentから送信されるさまざまなインテントを処理できるBroadcastReceiver Javaクラス(AlexaDirectiveReceiverなど)を追加します。レシーバーには任意の名前を付けることができます。ただし、クラスが(前のセクションの)マニフェストの宣言と一致している必要があります。

BroadcastReceiverクラスは、Alexaから受信したすべてのディレクティブの処理を行います。AlexaはVSK Agentにディレクティブを送信し、VSK AgentがBroadcastReceiverにディレクティブを知らせます。

BroadcastReceiverクラスの例を以下に示します。

// -------------------------------\
// MyDirectiveReceiver.java
// -------------------------------/
public class MyDirectiveReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {

    if (VSKIntentConstants.ACTION_ALEXA_DIRECTIVE.equals(intent.getAction())) {
      String namespace = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_NAMESPACE);
      String name = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_NAME);
      String payload = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_PAYLOAD);
      PendingIntent response = intent.getParcelableExtra(VSKIntentConstants.EXTRA_DIRECTIVE_RESPONSE_PENDING_INTENT);

      boolean didSucceed = false;
      boolean sendResponse = true;
      if (namespace.equals("RemoteVideoPlayer") {
        if (name.equals("SearchAndPlay") {
          sendResponse = false; // このオペレーションの処理は非同期で、PendingIntentを渡し、ステータスがわかったらコールバックします
          handlePlay(payload, response); // エンティティの抽出とインテントの作成を行い、プレーヤーのアクティビティへのディープリンクを設定します
        } else if (name.equals("SearchAndDisplayResults") {
          didSucceed = handleSearch(payload); // エンティティの抽出とインテントの作成を行い、検索のアクティビティへのディープリンクを設定します
        }
      } else if (name.equals("PlaybackController") {
        // ...
      } else if // ...
      if (response != null && sendResponse) {
        Intent success = new Intent().putExtra(VSKIntentConstants.EXTRA_DIRECTIVE_STATUS, didSucceed);
        try {
          response.send(context, 0, success);
        } catch(PendingIntent.CanceledException e) {
          // 応答に時間がかかりすぎているため、ログにエラーを出力します
        }
      }
    }
  }
}

このコードではAlexaからディレクティブを受け取ります。このコードには、コンテンツに応じてロジックを実行するためのプレースホルダーが含まれています。ディレクティブが正常に処理された場合は、成功のステータスと共にレスポンスを送信します。このレスポンスでは、successパラメーターとしてtrueまたはfalseのブール値が設定されます。

次の手順8: ディレクティブに応答するでは、アプリが受け取るさまざまなディレクティブと、その処理方法についてさらに詳しく説明します。

サンプルアプリに関する注意事項

サンプルアプリのAlexaDirectiveReceiverクラスには、上記の例よりもさらに詳細なロジックやその他のコンテキストが含まれています。サンプルアプリでは、より現実的なコンテキストでのディレクティブの処理を確認できます。

動的機能の統合のテスト(オプション)

動的統合では(統合にVSK Agent Client LibraryとそのままのVSKApplicationAgentAPIパッケージのどちらを使用した場合でも)、sendCapabilityTestDirectiveメソッドを呼び出してアプリの統合のテストを行うことができます。このメソッドを呼び出すと、Fire OSのルーティングエージェントが、VSKディレクティブでアプリを呼び出すための機能のレポートを返します。

このメソッドは、特定のディレクティブの処理が正常に機能するかどうかをテストするためのものではありません。このメソッドの目的は、デバイスの通信チャネルが機能していることを確認することです。これにより、アプリの機能が正しくレポートされていること、および(Fire TVデバイスに接続したり、リクエストや発話を行ったりする必要なく)BroadcastReceiverがルーティングエージェントからインテントを受信できることを確認できます。

次のコードでは、sendCapabilityTestDirective()メソッドを呼び出す方法を示します。

// -------------------------------\
// MyDirectiveReceiver.java
// -------------------------------/
public class MyDirectiveReceiver extends BroadcastReciever {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (VSKIntentConstants.ACTION_ALEXA_DIRECTIVE.equals(intent.getAction())) {
            String namespace = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_NAMESPACE);
            String name = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_NAME);
            String payload = intent.getStringExtra(VSKIntentConstants.EXTRA_DIRECTIVE_PAYLOAD);

            if (VSKIntentConstants.TEST_DIRECTIVE_NAMESPACE.equals(namespace) &&
                VSKIntentConstants.TEST_DIRECTIVE_NAME.equals(name)) {
                log.d(TAG, payload);
            }
            ...
        }
        ...
     }
}

requestTestDirectiveFromVSKAgent()メソッドを呼び出すと、VSKルーティングエージェントからアプリにテストディレクティブが送信されます。Alexaに対してリクエストや発話を行う必要はありません。このインテントのペイロードは、ルーティングエージェントがそのアプリについて記録した機能のリスト(JSON形式)です。以下に例を示します。

{"capabilities":[{"configurations":{"operations":["SearchAndDisplayResults","SearchAndPlay"],"catalogs":[{"type":"VIDEO_PUBLIC_CATALOG_IDENTIFIER","sourceId":"imdb"}]},"interface":"Alexa.RemoteVideoPlayer","type":"AlexaInterface","version":"3.1"},{"interface":"Alexa.PlaybackController","type":"AlexaInterface","version":"3","supportedOperations":["Play","Pause","Stop"]}]}

サンプルアプリに関する注意事項

サンプルアプリでsendCapabilityTestDirective()メソッドを確認するには、DynamicCapabilityReporterクラス(app/java/com/example/vskfiretv/company/reporterにあります)を参照してください。具体的には、次のセクションです。

public void requestTestDirectiveFromVSKAgent() {
    Log.i(TAG, "アプリにテストディレクティブを送信するようにVSK Agentにリクエストしています");
    client.sendCapabilityTestDirective();
    Log.i(TAG, "テストディレクティブのリクエストが完了しました");
}

サンプルアプリでは、MainActivity.javaでこのメソッドを呼び出しています。サンプルアプリでは、ExecutorServiceを使用して、メインスレッドとは別のバックグラウンドスレッドを開始しています。

// 機能を報告するためのバックグラウンドスレッドを開始
final ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(reporter::reportDynamicCapabilities);

次のステップ

次の手順の 手順8: ディレクティブに応答するに進みます。