Android から Amazon SNS を使ってみる

# ０．はじめに

以前、こちらの記事を投稿したんですが、

* [Python から Amazon SNS のアプリケーションプラットフォームのエンドポイントへリクエストを発行してみる \- Qiita](https://qiita.com/kusokamayarou/items/faec99b73e172cee5f53)

書いた以上はやらないとな…、
と思い、

Android 全く使ったことないですが…、
頑張って Android から Amazon SNS を使ってみました。

# １．Android Studio で、新規プロジェクトを作成する

1. Android Studio を起動し、「Start a new Android Studio project」リンクをクリックします。
    * ![1001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c9335f0b-b55f-bf5f-9827-1f93ccd42452.png)
<br><br>
1. 「Create Android Project」画面が表示されるので、以下の項目を入力し「Next」ボタンを押下します。
    * Application name : ※任意
    * Company domain : ※任意
<br><br>
    * ![1002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/7de12ef1-b2e3-d165-b5cd-d2dc09ad5a30.png)
<br><br>
1. 「Target Android Devices」画面が表示されるので、とりあえずデフォルトの値のままで「Next」ボタンを押下します。
    * ![1003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/36a8424d-fb81-0cf0-82eb-c2d473bdf813.png)
<br><br>
1. 「Add an Activity to Mobile」画面が表示されるので、「Empty Activity」を選択し「Next」ボタンを押下します。
    * ![1004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/1b63add9-6f98-3b6c-6104-ad5d201fb629.png)
<br><br>
1. 「Configure Activity」画面が表示されるので、とりあえずデフォルトの値のままで「Next」ボタンを押下します。
    * ![1005.png](https://qiita-image-store.s3.amazonaws.com/0/161939/8fedec4e-5d9b-3534-9092-486e473ed0ba.png)
<br><br>
1. そのまま待っていると、プロジェクトが作成されます。
    * ![1006.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e37fad48-e66d-cc6f-e082-505d109b00c5.png)

# ２．Android Studio で、作成したプロジェクトを実機で動かす

1. 実機を接続して、以下のサイトを参考に開発モードの設定をします。
    * [Android端末の開発者モードをONにする方法 \- Qiita](https://qiita.com/knakamigawa/items/5b8bd2793920b517bf25)
<br><br>
1. Android Studio からプロジェクトを開き、「Run」アイコンをクリックします。
    * ![2001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/1fb4c63c-7b2f-47a4-10d3-58bf9d03ce01.png)
<br><br>
1. 「Select Deployment Target」ダイアログが表示されるので、接続した実機が表示されていることを確認し、選択後、「OK」ボタンを押下します。
    * ![2002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/20558199-a784-d6b9-ede1-6a4d8c86f442.png)
<br><br>
1. 実機にアプリがインストール後、実行され、以下の「Hello World!」の画面が表示されます。
    * ![2003.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/00a06cee-2433-af9a-f0bd-1635b0c08076.jpeg)

# ３．Firebase プロジェクトを作成する

1. 以下のサイトから、FireBase のコンソールを開き、「プロジェクトを追加」ボタンを押下します。
    * ![3001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/f25b3a17-fe38-9fd6-e52c-fd24d7fe9b80.png)
<br><br>
1. 「プロジェクトを追加」ダイアログが表示されるので、以下の項目を設定し、「プロジェクトを作成」ボタンを押下します。
    * プロジェクト名 : ※任意
    * 国 / 地域 : ※任意
<br><br>
    * ![3002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/70f671ba-d0b8-839f-8b50-4059d59f407f.png)
<br><br>
1. 以下の画面が表示され、Firebase プロジェクトが作成されます。
    * ![3003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/04d6b7ef-dde1-32ea-4de3-71c39808090b.png)

# ４．Firebase プロジェクトにアプリを登録する。

1. 作成した Firebase プロジェクトのオーバービューから、「Android アプリに Firebase を追加」ボタンを押下します。
    * ![4001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/fe99ac5b-2c76-94dd-a6b6-e0b496ca1699.png)
<br><br>
1. 「Android アプリに Firebase を追加」ダイアログが表示されるので、以下の項目を設定し、「アプリの登録」ボタンを押下します。
    * Android パッケージ名 : ※作成した Android アプリのパッケージ名を入力
        * ※ MainActivity.java に記載。
<br><br>
    * ![4002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/d8a76557-d7de-d604-72fb-bde698b27eae.png)
<br><br>
1. 「Android アプリに Firebase を追加」ダイアログが更新され、「Android Studio の使用手順」が表示されるので、手順に従って google-services.json をダウンロードし、所定の場所に移動後、「続行」ボタンを押下します。
    * ![4003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/cf8bbd4e-df64-8971-0e64-a17a75e21cf3.png)
<br><br>
1. 「Android アプリに Firebase を追加」ダイアログが更新され、「Gradle の使用手順」が表示されるので、手順に従って２つの build.gradle を変更し、「Sync now」リンククリック後、「終了」ボタンを押下します。
    * ![4004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/2f430d32-7c32-8349-85b3-65bc9ce5c13c.png)
<br><br>
1. 「Android アプリに Firebase を追加」ダイアログが閉じ、Firebase プロジェクトの「概要」画面が表示されるので、アプリが登録されたことを確認します。
    * ![4005.png](https://qiita-image-store.s3.amazonaws.com/0/161939/65b582b3-c416-2a85-4871-bff5a7cb7864.png)

# ５．Firebase プロジェクトに登録したアプリのサーバーキーを確認する

1. Firebase プロジェクトの「概要」画面に表示されている登録したアプリエリアの右上のメニューを開き、「設定」を選択します。
    * ![5001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e04686dc-12e8-993a-b0c9-b45a54876ea8.png)
<br><br>
1. Firebase プロジェクトの「設定」画面が表示されるので、「クラウドメッセージング」タブを選択します。
    * ![5002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/99270a70-ad19-63af-32ad-b43a3e8b4f5b.png)
<br><br>
1. Firebase プロジェクトの「設定」画面に「クラウドメッセージング」の情報が表示されるので、「プロジェクト認証情報」エリアの「サーバーキー」を確認します。
    * ![5003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/94d1b2fd-75c1-60be-a9fc-711312db4c01.png)

# ６．Amazon SNS にプラットフォームアプリケーションを作成する

1. 以下のサイトから、Amazon SNS のコンソールを開きます。
    * [AWS SNS](https://ap-northeast-1.console.aws.amazon.com/sns/v2/home?region=ap-northeast-1#/home)
<br><br>
1. Amazon SNS のコンソールの左側ペインから、「アプリケーション」を選択します。
    * ![6001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/1dc4745f-8af9-3aea-8ddb-3caf8357008a.png)
<br><br>
1. Amazon SNS の「アプリケーション」画面が表示されるので、「プラットフォームアプリケーションの作成」ボタンを押下します。
    * ![6002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/80eeb84f-ab63-266b-ecb1-0d3813f50a28.png)
<br><br>
1. 「プラットフォームアプリケーションの作成」ダイアログが表示されるので、以下の項目を設定し、「プラットフォームアプリケーションの作成」ボタンを押下します。
    * アプリケーション名 : ※任意
    * プッシュ通知プラットフォーム : 「Google Cloud Messaging (GCM)」
    * API キー : ※確認しておいた Firebase プロジェクトのクラウドメッセージングの「サーバーキー」
        * <font color="Red">※「以前のサーバーキー」ではないので、注意!!</font>
<br><br>
    * ![6003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/11612953-2bbe-258a-787f-4b0724339f97.png)
<br><br>
1. Amazon SNS のプラットフォームアプリケーションが作成されます。
    * ![6004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/9dea6d17-3299-c3d2-9941-5dc280a4ad65.png)

# ７．Amazon Cognito に ID プールを作成する

1. 以下のサイトから、Amazon Cognito フェデレーテッドアイデンティティのコンソールを開きます。
    * [ID プール \- Amazon Cognito \- アマゾン ウェブ サービス](https://ap-northeast-1.console.aws.amazon.com/cognito/federated/?region=ap-northeast-1)
<br><br>
1. 「新しい ID プールの作成」ボタンを押下します。
    * ![7001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/7fa0ae22-cf11-d97c-4cd4-0c77148335d0.png)
<br><br>
1. 「使用開始ウィザード - ステップ 1:ID プールを作成する」画面が表示され、以下の項目を設定し、「プールの作成」ボタンを押下します。
    * ID プール名 : ※任意
    * 認識されていない ID
        * 認識されていない ID に対してアクセスを有効にする : ☑︎
<br><br>
    * ![7002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e4d08838-d5e7-af96-686d-b607b179e606.png)
<br><br>
1. 画面が更新されるので、新しく作成される２つ(Auth と Unauth)の IAM ロールのロール名を確認し、「許可」ボタンを押下します。
    * ![7003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/51d1ca46-f5da-184c-b529-0762e6f9e823.png)
<br><br>
1. 「サンプルコード」画面が表示され、ID プールが作成されます。
    * ![7004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4118435c-9a06-6ae4-4603-ff432b84f195.png)

# ８．作成した Amazon Cognito ID プールの IAM ロール に Amazon SNS 用のインラインポリシーを追加する

1. 以下のサイトから、AWS Identity and Access Management (IAM) のコンソールを開きます。
    * [IAM Management Console](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/home)
<br><br>
1. AWS Identity and Access Management (IAM) のコンソールの左側ペインから、「ロール」を選択します。
    * ![8001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/838dbee3-2e4c-54bc-2473-ff21358f7bde.png)
<br><br>
1. ロールの一覧が表示されるので、作成した Amazon Cognito ID プールの IAM ロール (Unauth) の「ロール名」リンクをクリックします。
    * ![8002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/298aff6f-7788-6f23-c9f2-997e43edca18.png)
<br><br>
1. 作成した Amazon Cognito ID プールの IAM ロール (Unauth) の概要の画面が表示されるので、「アクセス権限」のタブを選択し、「インラインポリシーの追加」リンクをクリックします。
    * ![8003.png](https://qiita-image-store.s3.amazonaws.com/0/161939/79ffcf9e-17fd-6aaf-19e6-64f51db9f532.png)
<br><br>
1. 「ポリシーの作成」画面が表示されるので、「ビジュアルエディタ」のタブを選択後、以下の項目を設定し、「Review policy 」ボタンを押下します。
    * サービス : SNS
    * アクション : 
        * 書き込み : 
            * ☑︎ CreatePlatformEndpoint
            * ☑︎ SetEndpointAttributes
<br><br>
    * ![8004.png](https://qiita-image-store.s3.amazonaws.com/0/161939/81f4c042-73ea-8764-0669-29f490c592e9.png)
<br><br>
1. 「ポリシーの作成 - ポリシーの確認」画面が表示されるので、以下の項目を設定し、「Create policy 」ボタンを押下します。
    * 名前 : ※任意
<br><br>
    * ![8005.png](https://qiita-image-store.s3.amazonaws.com/0/161939/3e479fe5-53db-2c97-de84-deda4e483ce8.png)
<br><br>
1. 作成したインラインポリシーの内容を確認します。
    * ![8006.png](https://qiita-image-store.s3.amazonaws.com/0/161939/58f46d37-68ed-acc1-cde8-8908ca77e4a4.png)

# ９．Android アプリへ実装する

<ol>

<li>`<project>/<app-module>/build.gradle` へ、以下のライブラリの登録の設定を追加する。</li>

```groovy:build.gradle

〜

dependencies {

    〜

    // [2018.01.12] ADD - BGN
    // 「Android端末で、FCM経由でAWSSNSを受け取るまで - Qiita」
    // <https://qiita.com/k_keisuke/items/24afa62955808721033e>
    // ...
    compile 'com.google.firebase:firebase-core:10.2.1'
    compile 'com.google.firebase:firebase-messaging:10.2.1'
    // ...
    compile 'com.amazonaws:aws-android-sdk-core:2.4.+'
    compile 'com.amazonaws:aws-android-sdk-sns:2.4.+'
    // [2018.01.12] ADD - END
}

〜
```

<li>AndroidManifest.xml へ、追加するクラスの設定を追加する。</li>

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kusokamayarou.android_sns_sample0001">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        〜

        <!-- [2018.01.12] ADD - BGN -->
        <!--「マニフェストの設定」-->
        <!-- https://docs.kii.com/ja/samples/push-notifications/push-notifications-android-fcm/modify-manifest/ -->
        <service android:name=".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <service android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        <!-- [2018.01.12] ADD - END -->

    </application>

</manifest>
```

<li>以下の MyFirebaseInstanceIDService.java を追加する。</li>

```java:MyFirebaseInstanceIDService.java
package com.kusokamayarou.android_sns_sample0001;

import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 「Android端末で、FCM経由でAWSSNSを受け取るまで - Qiita」
// <https://qiita.com/k_keisuke/items/24afa62955808721033e>

import com.amazonaws.regions.Regions;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.CreatePlatformEndpointRequest;
import com.amazonaws.services.sns.model.CreatePlatformEndpointResult;
import com.amazonaws.services.sns.model.InvalidParameterException;
import com.amazonaws.services.sns.model.SetEndpointAttributesRequest;

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private final static String TAG = MyFirebaseInstanceIDService.class.getSimpleName();

    private static final String APPLICATION_ARN = "[プラットフォームアプリケーションの ARN]";
    private static final String ENDPOINT = "https://sns.ap-northeast-1.amazonaws.com";
    //private static final String ACCESS_KEY = "AWSのアクセスキー";
    //private static final String SECRET_KEY = "AWSのSecretKey";

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String token = FirebaseInstanceId.getInstance().getToken();
        sendRegistrationToServer(token);
    }

    @SuppressLint("LongLogTag")
    private void sendRegistrationToServer(String token) {
        //AmazonSNSClient client = new AmazonSNSClient(generateAWSCredentials());
        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                getApplicationContext(),
                "[Amazon Cognito の ID プールの ID]", // ID プールの ID
                Regions.AP_NORTHEAST_1 // リージョン
        );
        AmazonSNSClient client = new AmazonSNSClient(credentialsProvider);
        client.setEndpoint(ENDPOINT);
        //SharedPreferenceに保存したendpointArnが存在したらそちらから取得するようにしてもOK
        String endpointArn = createEndpointArn(token, client);
        // 「[Android] データを保存し Android Studio で確認 SharedPreferences | nyanのアプリ開発」
        // <https://akira-watson.com/android/sharedpreferences.html>
        SharedPreferences dataStore = getSharedPreferences("DataStore", MODE_PRIVATE);
        SharedPreferences.Editor editor = dataStore.edit();
        editor.putString("DeviceToken", token);
        editor.putString("EndpointArn", endpointArn);
        editor.apply();
        Log.i(TAG, "@@@@@@@@@@@@@@@@@@@@ | DeviceTokenArray: " + token);
        Log.i(TAG, "@@@@@@@@@@@@@@@@@@@@ | EndpointArnArray: " + endpointArn);
        HashMap<String, String> attr = new HashMap<>();
        attr.put("Token", token);
        attr.put("Enabled", "true");
        SetEndpointAttributesRequest req = new SetEndpointAttributesRequest().withEndpointArn(endpointArn).withAttributes(attr);
        client.setEndpointAttributes(req);
    }

    @SuppressLint("LongLogTag")
    private String createEndpointArn(String token, AmazonSNSClient client) {
        String endpointArn;
        try {
            System.out.println("Creating platform endpoint with token " + token);
            CreatePlatformEndpointRequest cpeReq =
                    new CreatePlatformEndpointRequest()
                            .withPlatformApplicationArn(APPLICATION_ARN)
                            .withToken(token);
            CreatePlatformEndpointResult cpeRes = client
                    .createPlatformEndpoint(cpeReq);
            endpointArn = cpeRes.getEndpointArn();
        } catch (InvalidParameterException ipe) {
            String message = ipe.getErrorMessage();
            System.out.println("Exception message: " + message);
            Pattern p = Pattern
                    .compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " +
                            "with the same token.*");
            Matcher m = p.matcher(message);
            if (m.matches()) {
                // The platform endpoint already exists for this token, but with
                // additional custom data that
                // createEndpoint doesn't want to overwrite. Just use the
                // existing platform endpoint.
                endpointArn = m.group(1);
            } else {
                // Rethrow the exception, the input is actually bad.
                throw ipe;
            }
        }
        storeEndpointArn(endpointArn);
        return endpointArn;
    }

    /*
    private AWSCredentials generateAWSCredentials() {
        return new AWSCredentials() {
            @Override
            public String getAWSAccessKeyId() {
                return ACCESS_KEY;
            }

            @Override
            public String getAWSSecretKey() {
                return SECRET_KEY;
            }
        };
    }
    */

    private void storeEndpointArn(String endpointArn) {
        //SharedPreferenceにでもendpointArnを保存して、次回以降はcreateEndpointArnの処理を省略しても良い(公式はその方式になってる)
    }

    /*
    private String getEndPointArn() {
        //SharedPreferenceからendpointArnを取得して、次回以降はcreateEndpointArnの処理を省略しても良い(公式はその方式になってる)
    }
    */
}
```

<li>以下の MyFirebaseMessagingService.java を追加する。</li>

```java:MyFirebaseMessagingService.java
package com.kusokamayarou.android_sns_sample0001;

import android.annotation.SuppressLint;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private final static String TAG = MyFirebaseMessagingService.class.getSimpleName();

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @SuppressLint("LongLogTag")
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // TODO(developer): Handle FCM messages here.
        // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
        Log.i(TAG, "From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.i(TAG, "Message data payload: " + remoteMessage.getData());
        }

        // 「【Android】NotificationからIntentでデータを渡してアプリ起動するときのIntent.setFlagsメモ - Qiita」
        // <https://qiita.com/SnowMonkey/items/7cdc52c83bb9490d97a5>
        NotificationManager notificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("hoge", "fuga");
        intent.setFlags(
                Intent.FLAG_ACTIVITY_CLEAR_TOP  // 起動中のアプリがあってもこちらを優先する
                        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  // 起動中のアプリがあってもこちらを優先する
                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS  // 「最近利用したアプリ」に表示させない
        );
        PendingIntent contentIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        intent,
                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(android.R.drawable.sym_def_app_icon)
                        .setContentTitle(remoteMessage.getData().toString())
                        .setContentText("Notification Message")
                        .setStyle(new NotificationCompat.BigTextStyle().bigText("Notification Message"));
        mBuilder.setContentIntent(contentIntent);
        notificationManager.notify(0, mBuilder.build());
    }
}
```

<li>MainActivity.java へ、以下のコードを追加する。</li>

```java:MainActivity.java
package com.kusokamayarou.android_sns_sample0001;

import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    // [2018.01.12] ADD - BGN
    private final static String TAG = MainActivity.class.getSimpleName();
    // [2018.01.12] ADD - END

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // [2018.01.12] ADD - BGN
        // 「[Android] データを保存し Android Studio で確認 SharedPreferences | nyanのアプリ開発」
        // <https://akira-watson.com/android/sharedpreferences.html>
        SharedPreferences dataStore = getSharedPreferences("DataStore", MODE_PRIVATE);
        String DeviceTokenArray = dataStore.getString("DeviceToken", "");
        Log.i(TAG, "@@@@@@@@@@@@@@@@@@@@ | DeviceTokenArray: " + DeviceTokenArray);
        String EndpointArnArray = dataStore.getString("EndpointArn", "");
        Log.i(TAG, "@@@@@@@@@@@@@@@@@@@@ | EndpointArnArray: " + EndpointArnArray);
        // [2018.01.12] ADD - END
    }
}
```

# １０．アプリを実行し、Amazon SNS からの通知を確認する。

1. こちらのサイト ( [Android に Firebase Cloud Messaging クライアント アプリを設定する  \|  Firebase](https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja) ) にも記載がありますが、FCM の登録トークンを改めて取得したい場合は、アプリをアンインストールしたりすればいい様なので、とりあえず一度アプリをアンインストールします。アプリのアンインストールは、ググれば出て来ると思います。
    * [android アプリ　削除 \- Google 検索](https://www.google.co.jp/search?client=safari&rls=en&q=android+%E3%82%A2%E3%83%97%E3%83%AA%E3%80%80%E5%89%8A%E9%99%A4&ie=UTF-8&oe=UTF-8&gfe_rd=cr&dcr=0&ei=LUNYWrWQFevZ8AeOyJHYBg)
<br><br>
1. Android Studio からデバッグモードで RUN 実行します。
    * ![10-01.png](https://qiita-image-store.s3.amazonaws.com/0/161939/8630b420-184a-2534-c8a3-0cb195d97d45.png)
<br><br>
1. Android Studio の Logcat に登録トークンがログ出力されます。
    * ![10-02.png](https://qiita-image-store.s3.amazonaws.com/0/161939/8d7b76c8-2c4b-9946-8646-7f32373e5e16.png)
<br><br>
1. Amazon SNS のプラットフォームアプリケーションの詳細画面を開き、登録トークンからエンドポイントが作成されたか確認します。
    * ![10-03.png](https://qiita-image-store.s3.amazonaws.com/0/161939/22c431a5-b995-87ba-f515-15c8e2ad0c1d.png)
<br><br>
1. 作成されたエンドポイントを選択し、「エンドポイントの発行」ボタンを押下します。
    * ![10-04.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e4f22619-0940-7665-7ad9-99181b921981.png)
<br><br>
1. 「メッセージを発行」画面が表示されるので、以下の項目を設定し、「メッセージの発行」ボタンを押下します。
    * メッセージ形式 : JSON
    * メッセージ
        * `{ "GCM": "{ \"data\": { \"message\": \"Test\" } }" }`
<br><br>
    * ![10-05.png](https://qiita-image-store.s3.amazonaws.com/0/161939/b22a07e2-62c0-c808-34f2-995a0e87529f.png)
<br><br>
1. 実機に通知が届いたか確認します。
    * ![10-06.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/136e4212-1cd9-72b2-4d4c-ddb182e92b77.jpeg)

# ９９．ハマりポイント

* 通知の確認のところでも確認しましたが、登録トークンがどうやったら改めて取得できるのかよくわからなく、ちょっと戸惑いました。
<br><br>
* 今回、Firebase プロジェクトのアプリの登録を手動で行いましたが、以下のサイトを見ると Firebase Assistant を使用して登録する手順を推奨している様にも思いました。
    * [Android プロジェクトに Firebase を追加する  \|  Firebase](https://firebase.google.com/docs/android/setup?hl=ja)
<br><br>
* 後は単純に Android 開発自体ほぼ初めてだったので、Android Studio の使い方からよくわからなかったので、ちょっと苦労しました。
<br><br>
* っていうか、Android も触ったことなかったので、アプリのアンインストールのやり方とか、通知の確認の仕方とか、逐一わからなくて苦労しました。

# ＸＸ．まとめ

コードにもコメントで記載していますが、今回も多くのサイトに助けられました。

特に、こちらのサイトはお世話になりました。

* [Android端末で、FCM経由でAWSSNSを受け取るまで \- Qiita](https://qiita.com/k_keisuke/items/24afa62955808721033e)

っていうか、
ほぼ丸コピに近い様な…。
本当にありがとうございました。

他にも、
* [\[Android\]プッシュ通知実装\[Firebase\]\[FCM\] – チェンぴログ](https://chenpilog.com/2016/10/14/android-notification-firebase/#DHC)
* [マニフェストの設定](https://docs.kii.com/ja/samples/push-notifications/push-notifications-android-fcm/modify-manifest/)
* [\[Android\] データを保存し Android Studio で確認 SharedPreferences \| nyanのアプリ開発](https://akira-watson.com/android/sharedpreferences.html)
* [【Android】NotificationからIntentでデータを渡してアプリ起動するときのIntent\.setFlagsメモ \- Qiita](https://qiita.com/SnowMonkey/items/7cdc52c83bb9490d97a5)

など、
参考にさせて頂きました。
ありがとうございました。

次は、iOS だな…。