開発者コンソール

Amazon Device Messaging(ADM)とFire TVのローカル通知

Kevin Tsang Jul 21, 2021
Share:
Fire TV How to
Blog_Header_Post_Img

現在、Amazon Fire TVでは、Android通知APIを介した標準のAndroid通知がサポートされています。このAPIを使用すると、アプリのユーザーインターフェイス外に表示されるローカル通知をユーザーに送信できます。最近では、スマートフォンユーザーに通知を送信して注意を促す方法がアプリ開発者にとってかなり一般的になっています。

同様に、Fire TVでは、通知を通じてユーザーにアプリを再度利用するよう促すこともできます。通知を使用すると、アプリで新しい機能、コンテンツ、プロモーションキャンペーンなどが利用可能になったときに、ユーザーに案内することができます。

このブログ投稿では、通知の種類とユーザーエクスペリエンス、Amazon Device Messaging(ADM)経由でサーバーメッセージを送信する方法、Android通知APIを使用してそのメッセージをFire TVでローカル通知に変換する方法について説明します。

注: バックエンドからAmazon Fire OSデバイス(Fire TVやFireタブレットなど)にメッセージをプッシュするには、ADMが必要です。

ローカル通知

Fire TVでは、次の3種類のローカル通知がサポートされています。

  • ヘッドアップ通知
  • 標準の通知
  • トースト

 

1. ヘッドアップ通知

Fire TVでは、新しいアプリやアップデートが利用可能になったときに、デフォルトでユーザーに通知が送信されます。Android通知APIを使用して通知の優先度を高に指定して、ヘッドアップ通知をユーザーに送信することもできます。

これを設定するには次のメソッドを呼び出す必要があります。

Copied to clipboard
.setPriority(NotificationCompat.PRIORITY_HIGH)

Fire TVでは、ヘッドアップ通知の表示が標準のAndroidとは若干異なります。Fire TVのヘッドアップ通知のユーザーエクスペリエンスについては、次のようになります。

ADM notification

2. 標準の通知

標準の通知は、開発者が通知の優先度を指定していない場合に送信されます。標準の通知は、Fire TVの [設定] の通知センターに保存されます。標準の通知はヘッドアップ通知として表示されないため、ユーザーが別のアプリを使用しているときやFire TVのメインUIを操作しているときに、ユーザーエクスペリエンスが妨げられることはありません。

Fire TVの通知センターは次のように表示されます。

ADM standard notification

3. トースト

トーストはアプリ内で短い時間表示されてから消える小さなポップアップウィンドウです。ユーザーはトーストのメッセージに対してアクションを取ることはできません。ヘッドアップ通知とは異なり、トーストは通知センターに保存されません。開発者は、以下のmakeText()メソッドとshow()メソッドを使用してトーストメッセージを送信できます。表示時間は、makeText()メソッドでも調整できます。

Copied to clipboard
        Context context = getApplicationContext();
        CharSequence text = title + message;
        int duration = Toast.LENGTH_LONG;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

トーストメッセージはFire TVで次のように表示されます。

ADM toasts

通知方法を選択する方法

トースト通知ではポップアップダイアログを表示できますが、ヘッドアップ通知では効果的なグラフィックでユーザーの注意を引き、すぐにアプリを起動するようユーザーを誘導することもできます。

注: 別のアプリがフォアグラウンドにあるときはヘッドアップ通知が送信されないようにしてください。ヘッドアップ通知が表示されると、ユーザーエクスペリエンスが損なわれる可能性があります。別のアプリがフォアグラウンドに存在するかどうかを確認し、存在する場合はヘッドアップ通知を表示しないようにするには、通知メカニズムを構築します。

アプリのリリース情報など、重要度の低い通知の場合は、ヘッドアップ通知ではなく標準の通知をお勧めします。コンテンツの利用中にユーザーの気を散らさないためです。  通知メカニズムを計画する際は、常にユーザーエクスペリエンスを考慮してください。

ADMを使用したサーバー側のメッセージング

サーバー側のメッセージングソリューションには、モバイル開発者が使用できる拡張性の高い通信ツールが用意されています。開発者は、何百万ものクロスプラットフォームデバイスにメッセージを送信し、Eメール、SMS、プッシュ、音声などのチャネルを通じてユーザーとつながることができます。

Fire TVなどのFire OSデバイスにメッセージを送信するために必要なAmazon Device Messaging(ADM)をサポートするサーバー側のメッセージングソリューションの例として、AWS Pinpointがあります。また、開発者は、AWS Pinpointを使用してユーザーエンゲージメントを測定し、アプリから分析データを生成することもできます。マーケティングチームであれば、この分析情報を活用してキャンペーンを強化したり、ユーザーとの効果的なコミュニケーション方法を判断したりすることができます。

このブログ記事では主に、Amazon開発者ポータルで入手できるADM SDKを使用してADMを実装する方法について説明します。以下のセットアップ手順を進める前に、ADMのアーキテクチャや、各ADMコンポーネントの役割とその内容の詳細について、ADMの概要ページを参照してください。

1. サーバーのセットアップ

ADM SDKをダウンロードすると、examplesフォルダのserver-pythonフォルダ内にサーバーのスクリプトがあります。サーバーを実行するには、次の手順を実行します。

  1. server.pyの先頭のPORTの値を、サーバーでリッスンするポートに変更します。続行する前に、このポートが開いておりアクセス可能であることを確認してください。
  2. PROD_CLIENT_IDとPROD_CLIENT_SECRETの値を、Amazonから受け取った値に変更します。この値はserver.pyの先頭にも付記されています。
  3. コマンドラインからpython server.pyを実行します。

手順2のPROD_CLIENT_IDとPROD_CLIENT_SECRETの認証情報はAmazonから割り当てられます。開発者サーバーは、リクエストでこの両方の認証情報を使用して、アクセストークンを取得します。

上記の手順3以降では、ブラウザからサーバーにアクセスできます。下の画像は、クライアントにメッセージを送信するためのサーバーUIです。

Select a Device

開発者サーバーからアプリへの大まかなメッセージフローは下図のとおりです。この例では、「Your Server」が、ADM SDKに組み込まれているPythonスクリプトとして記述された自己完結型のサンプルウェブアプリに置き換えられます。このウェブアプリは、クライアントアプリにメッセージを送信するためにサーバーで実装可能なさまざまなタスクをシミュレートします。

Servers

2. クライアントのセットアップ

同じexamplesフォルダの下に、クライアントプロジェクトが含まれているADMMessengerフォルダがあります。

クライアントを実行するには、次の手順に従います。

  1. ADMMessenger/assets/api_key.txtで、テキスト行の「Replace this line with your API Key.」を、Amazonから受け取ったAPIキーに置き換えます。

ADMMessenger/res/values/strings.xmlで、server_addressとserver_portの値を、サーバーの参照値に変更します。

Copied to clipboard
<string name="server_address">http://xxx.xxx.xx.xx</string>
<string name="server_port">8080</string>

上記の設定が完了したら、Android Studioからクライアントアプリを構築、インストール、実行することができます。

以下はADM SDKに基づくサンプルコードです。ADM経由で取得したJSONファイルのデータを使用してローカル通知を作成し、ヘッドアップ通知としてFire TVに表示する方法を示しています。

Copied to clipboard
public static void createADMNotification(final Context context, final String titleKey, final String msgKey, final String urlKey, final String timeKey,
                                             final String intentAction, final String title, final String msg, final String url, final String time)
    {

        /* 通知をクリックすると、MainActivityが表示されます。*/
        /* インテントFLAGSによってMainActivityの複数のインスタンスが開かないようにします。*/
        final Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        notificationIntent.putExtra(titleKey, title);
        notificationIntent.putExtra(msgKey, msg);
        notificationIntent.putExtra(urlKey, url);
        notificationIntent.putExtra(timeKey, time);

        /* Androidで同じアクションのインテントを再利用します。アクションにタイムスタンプを追加し、*/
        /* onResume()で受け取った通知インテントがリサイクルされたインテントではないことを確認します。これは古いエクストラを保持している可能性があるためです。*/
        notificationIntent.setAction(intentAction + time);

        final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent,Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL);

        Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.amazon1280);

        Notification.Builder builder;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder = new Notification.Builder(context, CHANNEL_ID)
                    .setContentTitle(title)
                    .setContentText(msg)
                    .setContentText(url)
                    .setColor(Color.BLUE)
                    .setSmallIcon(R.drawable.ic_launcher_foreground)
                    .setLargeIcon(largeIcon)
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true);
        } else {
            builder = new Notification.Builder(context)
                    .setContentTitle(title)
                    .setContentText(msg)
                    .setContentText(url)
                    .setColor(Color.BLUE)
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setSmallIcon(R.drawable.ic_launcher_foreground)
                    .setLargeIcon(largeIcon)
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true);
        }

        Notification notification = builder.build();

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
        notificationManager.notify(context.getResources().getInteger(R.integer.sample_app_notification_id), notification);
    }

以下は、アプリからアラートが送信されたときのユーザーエクスペリエンスです。

Customer experience

 

まとめ

AWS Pinpoint、Amazon Device Messaging、ローカル通知機能などのマーケティングコミュニケーションサービスと組み合わせて使用することで、Fire TVはエンゲージメントを高める強力な手段となります。  詳細については、Amazon Device Messaging(ADM)のドキュメントを参照してください。

関連記事

ニュースレターを購読してみませんか?

最新のAmazon開発者向けニュース、業界の動向、ブログの記事をお届けします。