Android Dev Site のチュートリアルに従いましたが (新しい GCM API を使用しています)、GCM セットアップに関してすべてが正しく行われていることを確認したいので、次のように分割します。セクション:
マニフェスト ファイル:
1) 私のアプリケーションのパッケージ名は次のとおりです: package="com.abc.xyz.demo"
<permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE" />
私のブロードキャスト レシーバーとインテント サービスは、次のようにマニフェストにあります。
<receiver
android:name="com.abc.xyz.demo.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.abc.xyz.demo" />
</intent-filter>
</receiver>
<service android:name="com.abc.xyz.demo.gcm.GCMIntentService" />
com.abc.xyz.demo.gcm パッケージには、GCMBroadcastReceiver と GCMIntentService が含まれています。次のように、今のところブロードキャスト レシーバーのみを使用しています (チュートリアルで IntentService はオプションであると述べられているため)。
public class GCMBroadcastReceiver extends BroadcastReceiver
{
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
Context ctx;
public TWGCMBroadcastReceiver()
{
Log.i("GCMAudit", "Receiver Instaniated!");
}
@Override
public void onReceive(Context context, Intent intent)
{
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
ctx = context;
String messageType = gcm.getMessageType(intent);
if (messageType != null && messageType.length() > 0)
{
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
sendNotification("Send error: " + intent.getExtras().toString());
else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType))
sendNotification("Deleted messages on server: " +intent.getExtras().toString());
else
sendNotification("Received: " + intent.getExtras().toString());
setResultCode(Activity.RESULT_OK);
}
else
{
setResultCode(Activity.RESULT_CANCELED);
}
}
// Put the GCM message into a notification and post it.
private void sendNotification(String msg)
{
mNM = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent cI = PendingIntent.getActivity(ctx, 0, new Intent(ctx, Main.class), 0);
...
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
正常に登録でき、regId をアプリケーション サーバーに送信できることに注意してください (現在、サーバーに直接アクセスすることはできません)。
ここにいくつかの一般的なクエリがあります:
1) Web アプリケーション サーバーまたは GCM は、パッケージ名を知る必要がありますか? その場合、明示的に送信する必要がありますか? 現在、Google プロジェクトから送信者 ID のみを送信しています。
2) パッケージ名が問題の場合、Android アプリケーションのパッケージ名をサーバーのパッケージ名 (存在する場合) と一致させるにはどうすればよいですか?
3) 上記の放送受信機の実装はテスト目的に十分ですか? または、サービスも書き出さない限り、メッセージは表示されませんか? (そうは思わない)
4) ブロードキャスト レシーバーの単体テストを行うにはどうすればよいですか? 現時点ではサーバーを操作できないため (メッセージを送信するための Web UI しかありません)