手順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.xml
(app/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: ディレクティブに応答するに進みます。