プッシュ通知用アプリの作成
さて、ここからはEclipseでの作業です。プッシュ通知を使うにはGoogle Play Servicesが必要なので、インストールされていなければインストールします。
EclipseからAndroid SDK Managerを開いて、Google Play Servicesがインストールされていることを確認します。
Google Play Servicesがまだインストールされていない場合は、チェックを付けてインストールしてください。
Google Play Servicesをインストールし終えたら、ダウンロードされたgoogle-play-service_libをプロジェクトとしてインポートしておきます。
インポートする際は、「プロジェクトをワークスペースにコピー」にチェックを付けます。
google-play-service_libは「android-sdk/extras/google/google_play_services/libproject/google-play-services_lib」や、「/Applications/(Eclipseのインストールフォルダ)/eclipse/sdk/extras/google/google_play_services/libproject/google-play-services_lib」などにあります。
インポートしたgoogle-play-service_libは、このあと、ライブラリとして利用します。
プッシュ通知用プロジェクトPushSampを作ります(注:この記事ではNCMB上に作ったアプリと同じ名前にしていますが、同じ名前にする必要はありません)。
プロジェクトを作成したら、プロジェクトのプロパティを開いて、左側のメニューでAndroidを選び、google-play-service_libをライブラリに追加します。
また、作成したプロジェクトのlibsフォルダに、NCMBのAndroid用SDKであるNCMB.jarファイルをコピーすることも忘れないでください。
次にAndroidManifest.xmlにメッセージを受信するブロードキャストレシーバを追加して、GCMを受け取るためのPermissionを登録します。
まず、ブロードキャストレシーバの宣言であるリスト1をAndroidManifest.xmlファイルの</application>タグの直前に追加します。
<receiver android:name="com.nifty.cloud.mb.NCMBGCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.example.pushsamp" /> </intent-filter> </receiver>
ブロードキャストレシーバにより、アプリケーションはシステムや他のアプリケーションによりブロードキャストされるインテントを、アプリケーションが実行していないときでも、受信できるようになります。
NCMBGCMBroadcastReceiverは、プッシュ通知にGCMの機能を使用するためのレシーバです。intent-filterはブロードキャストレシーバが応答できるインテントのタイプを特定します。
次に、アプリがPush通知を受信できるようにパーミッションを付与します。
リスト2をAndroidManifest.xmlファイルの<application>タグの直前に追加します。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.pushsamp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.pushsamp.permission.C2D_MESSAGE" />
今度は、MainActivityのonCreateメソッドにコードを追加していきます。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NCMB.initialize(getApplication(), getString(R.string.app_key), getString(R.string.client_key));(1) final NCMBInstallation installation = NCMBInstallation.getCurrentInstallation();(2) installation.getRegistrationIdInBackground(getString(R.string.sender_id), new RegistrationCallback(){(3) @Override public void done(NCMBException e) { if (e != null) { // 失敗 } else { try { installation.save();(4) } catch(NCMBException e2) { e2.printStackTrace(); } } } }); NCMBPush.setDefaultPushCallback(this, MainActivity.class);(5) }
NCMB.initializeメソッドでNCMB SDKの初期セットアップを行うわけですが、引数に指定しているapp_keyとclient_keyはNCMBでアプリを作成したときに表示されたアプリケーションキーとクライアントキーを、strings.xmlに登録したものです。
(2)からが配信端末情報の登録処理です。プッシュ通知を受け取る端末を、配信端末情報として登録します。NCMBInstallationクラスはプッシュ配信端末を操作するクラスです。
getCurrentInstallationメソッドは現在のInstallationを取得します。
registrationIdの取得を行うgetRegistrationIdInBackgroundメソッドに指定しているsender_idは、Google Developers Consoleで作成したプロジェクトのProject Numberです(3)。
installation.save()で配信端末を登録します(4)。
NCMBPush.setDefaultPushCallbackメソッドで、プッシュ通知を受信した際にデフォルトで動作するアクティビティを指定します(5)。
ここまで作成して、実機でアプリを実行してみたところ、java.lang.RuntimeExceptionが発生しました。Google Play Services Rev.20では
meta-dataの定義も必要になったようです。
リスト4をAndroidManifest.xmlの</application>の直前に追加して実行すると、Installationにオブジェクトが追加されました。
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
この端末に向けてプッシュ通知を送って行きます。