Android GCM 受信したメッセージを表示
Android GCMでメッセージを送るが多くの方に見て頂いているようで、有難うございます。
なので、調子に乗って、GCMでメッセージをサーバーから受信するところも書いておこうと思います。
Android GCMでメッセージを送るとは違い、サーバーサイドはJsonを利用したスクリプトを用意します。
下記の通りです。(http://labs.distriqt.com/post/1273 さんのものを引用させて頂きました。)
<?php $url = 'https://android.googleapis.com/gcm/send'; $registrationId = 'APA91bHqwcC6ztIHr2TZcr2Fmp_eWcqS0EHn796Cd8NKWb32tTJLz***'; //registration IDはここ $apiKey="AIzaSyBYyErq****"; //API Keyはここ //送りたいメッセージ $message = "the test message"; $tickerText = "ticker text message"; $contentTitle = "content title"; $contentText = "content body"; $response = sendNotification( $apiKey, array($registrationId), array('message' => $message, 'tickerText' => $tickerText, 'contentTitle' => $contentTitle, "contentText" => $contentText) ); echo $response; function sendNotification( $apiKey, $registrationIdsArray, $messageData ) { $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey); $data = array( 'data' => $messageData, 'registration_ids' => $registrationIdsArray ); $ch = curl_init(); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" ); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) ); $response = curl_exec($ch); curl_close($ch); return $response; } ?>
最初はですね、data、でサーバーに送るのはいいんだけど、アプリ側で取得する時に、何かdataの中に決まった名前で入れなくていいの??と思ったんですが、dataの後は、自分で好きなようにデータの名前をつければいいんですね。
アプリ側は、
Android GCMでメッセージを送るでも利用した、Googleさんが用意してくれているデモアプリの com.google.android.gcm.demo.app を使います。
GCMIntentService.javaのonMessageを次のように変更します。
protected void onMessage(Context context, Intent intent) { Log.i(TAG, "Received message"); String message = getString(R.string.gcm_message); displayMessage(context, message); // notifies user generateNotification(context, message); //ここから後を追加 String tickerText = intent.getStringExtra("tickerText"); Intent message_intent = new Intent(context, MessageReceivedActivity.class); message_intent.putExtra("tickerText", tickerText); message_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(message_intent); }
メッセージを表示するアクティビティを用意します。
このあたりは、Android Cloud to Device Messaging (C2DM) – Tutorialを参考にさせて頂きました。
//MessageReceivedActivity.javaを追加 package com.google.android.gcm.demo.app; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MessageReceivedActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_result); Bundle extras = getIntent().getExtras(); if (extras != null) { String tickerText = extras.getString("tickerText"); if (tickerText != null && tickerText.length() > 0) { TextView view = (TextView) findViewById(R.id.result); view.setText(tickerText); } } super.onCreate(savedInstanceState); } }
レイアウトファイルです。
//activity_result.xmlを追加 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/result" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:text="No info." android:textAppearance="?android:attr/textAppearanceLarge" > </TextView> </LinearLayout>
サーバーサイドのプログラムを実行すると、次の画面に切り替わり、tickerTextが受け取れたことがわかります。