Kindle Fireでの一般的な実装方法

Kindle Fire にアプリへプッシュ通知を実装し、プッシュトークンを得るための実装方法をご紹介します。

Kindle Fire では Amazon Cloud Messaging の SDK を導入する必要があります。

Amazon アプリ・ゲームサービス SDK のダウンロード

Amazon アプリ・ゲームサービス SDK のページへアクセスします。

ページからリンクされている「プログラム材料ライセンス規約」への同意が必要なのでご確認の上、Android 用の SDK をダウンロードします。

プロジェクトへライブラリの追加

ZIP ファイルを展開するとサービス事にSDKが含まれています。AmazonDeviceMessaging ディレクトリにある amazon-device-messaging-(バージョン).jar ファイルが必要となります。

このファイルを Android Studio のプロジェクトへ追加します。Project ウィンドウを[Project Files]モードに切り替え、app フォルダを選択し、[Show in Explorer]もしくは[Reveal in Finder]を選択して、app フォルダの実体を開きます。

次に、appフォルダ内にあるlibsフォルダに、amazon-device-messaging-(バージョン).jar ファイルをコピーします。

Android Studio に戻ると、Project ウィンドウの app フォルダ以下に libs フォルダが追加され、amazon-device-messaging-(バージョン).jarファイルが追加されます。amazon-device-messaging-(バージョン).jarファイルを右クリックし、[Add As Library…]を選択します。

次に、Project ウィンドウを[Android]に切り替え、Gradle Scripts という項目からアプリの設定を開きます。ここで Project と書かれた方がプロジェクト全体の設定、Module: app と書かれた方がアプリの設定となります。以下の行を探します。(implementationではなく、compileになっている場合もあります。)

1implementation files('libs/amazon-device-messaging-(バージョン).jar') 

この行を以下のように、provided に変更します。

1provided files('libs/amazon-device-messaging-(バージョン).jar') 

マニフェストにパーミッションを追加する

AndroidManifest.xml を開き、以下のように編集します。

 1<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 2   xmlns:amazon="http://schemas.amazon.com/apk/res/android"      <---- 追加します。
 3   package="[パッケージ名]"
 4   android:versionCode="1"
 5   android:versionName="1.0">
 6
 7  <!-- 以下の4行を追加します -->
 8  <permission android:name="[パッケージ名].permission.RECEIVE_ADM_MESSAGE" android:protectionLevel="signature" />
 9  <uses-permission android:name="[パッケージ名].permission.RECEIVE_ADM_MESSAGE" />
10  <uses-permission android:name="com.amazon.device.messaging.permission.RECEIVE" />
11  <uses-permission android:name="android.permission.WAKE_LOCK" />
12
13  <!-- (中略) -->
14
15  <application ...>
16    <!-- ADM を有効にします。requiredをtrueにした場合、ADMが使用できない場合はアプリを起動できなくなります。-->
17    <amazon:enable-feature android:name="com.amazon.device.messaging" android:required="false"/>
18
19    <!-- (中略) -->
20  </application>
21
22</manifest>

受信サービスを記述する

トークン・プッシュメッセージを受信した際に起動するサービスを実装します。ADMMessageHandlerBase を継承したサービスを作成します。トークンの受信時に onRegistered が呼ばれますのでこの中でサーバーへの登録処理を行います。また、通知が受信されるとonMessageが呼ばれます。この中でNotificationクラスを使うなどしてユーザーに通知を提示します。

 1package jp.co.fenrir.pushsample;
 2
 3import android.content.Intent;
 4import android.os.Bundle;
 5
 6import com.amazon.device.messaging.ADMMessageHandlerBase;
 7
 8public class ADMMessengerHandler extends ADMMessageHandlerBase {
 9
10    public ADMMessengerHandler(String s) {
11        super(s);
12    }
13
14    @Override
15    protected void onMessage(Intent intent) {
16        // メッセージ受信時の動作
17
18        // 通知ペイロードに含めたデータがextrasに入っています
19        Bundle extras = intent.getExtras();
20    }
21
22    @Override
23    protected void onRegistered(String registrationId) {
24        // 登録完了時の処理を記述します
25        // TODO registrationId (トークン) をサーバーへ送信します
26    }
27
28    @Override
29    protected void onUnregistered(String registrationId) {
30        // 登録解除時の処理を記述します
31    }
32
33    @Override
34    protected void onRegistrationError(String errorMessage) {
35        // 登録失敗時のエラー処理
36    }
37}

AndroidManifest.xml には以下のように記述して登録します。

1<service android:name=".ADMMessengerHandler" android:exported="false" />

受信ハンドラクラスを作成する

ADM から受け取ったメッセージを受信サービスへ中継するインテントレシーバーを作成します。これは、ADMMessageReceiver を継承し、先ほど作成した ADMMessageHandlerBase の派生クラスをコンストラクタで指定します。

1package jp.co.fenrir.pushsample;
2
3import com.amazon.device.messaging.ADMMessageReceiver;
4
5public class ADMMessageHandlerReceiver extends ADMMessageReceiver {
6    public ADMMessageHandlerReceiver() {
7        super(ADMMessengerHandler.class);
8    }
9}

AndroidManifest.xmlには以下のように記述して登録します。

1<receiver android:name=".ADMMessageHandlerReceiver" 
2    android:permission="com.amazon.device.messaging.permission.SEND">
3    <intent-filter>
4       <action android:name="com.amazon.device.messaging.intent.REGISTRATION" /> 
5       <action android:name="com.amazon.device.messaging.intent.RECEIVE" /> 
6       <category android:name="[パッケージ名]"/>
7    </intent-filter>
8</receiver>       

ご不明な点はありませんか?

機能の詳細、導入のご検討、お見積もり依頼などは、お気軽にお問い合わせください。
担当者から追ってご連絡いたします。

お問い合わせはこちら