使用适用于Android的Google Cloud Messaging无法接收消息(不是帮助程序库)

有没有人可以帮助我一个工作的例子,使用Google Cloud Messaging for Android从gcm接收消息。 我已经尝试了两种方法(帮助库和GoogleCloudMessaging类),似乎没有任何工作。 我正在使用一个PHP脚本,显示以下内容:

组播ID:5.2108110103215E + 18已成功处理的消息数量:1处理错误消息的数量:0标准ID:0

所以显然是永恒的。 我可以用这两种方式注册设备,使用助手库(gcm.jar)和使用GoogleCloudMessaging类。 问题是我没有办法通过PHP发送消息,或者至less我不知道如何正确处理它。 以下是我的清单中的权限和接收者:

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.READ_OWNER_DATA" /> <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <!-- Receives the actual messages. --> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <!-- Receives the registration id. --> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.example.gcm" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> 

最后这里是服务类

 public class GCMIntentService extends GCMBaseIntentService { private static final String PROJECT_ID = "49XXXXXXXX6"; private static final String TAG = "GCM Intent Service"; public GCMIntentService() { super(PROJECT_ID); Log.d(TAG, "GCMIntentService init"); } @Override protected void onError(Context ctx, String sError) { Log.d(TAG, "Error: " + sError); } @Override protected void onMessage(Context ctx, Intent intent) { Log.d(TAG, "Message Received"); String message = intent.getStringExtra("message"); sendGCMIntent(ctx, message); } private void sendGCMIntent(Context ctx, String message) { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("GCM_RECEIVED_ACTION"); broadcastIntent.putExtra("gcm", message); ctx.sendBroadcast(broadcastIntent); } @Override protected void onRegistered(Context ctx, String regId) { Log.d(TAG, regId); // Notify main UI to update registration status Intent registrationIntent = new Intent(); registrationIntent.setAction("registered"); registrationIntent.putExtra("regId", regId); sendBroadcast(registrationIntent); } @Override protected void onUnregistered(Context ctx, String regId) { //... } } 

以下是使用GoogleCloudMessaging类时的代码(我更改了清单以使用自定义接收器):

 public class GCMBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "GCM Receiver"; public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; private Context ctx; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Message received"); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); ctx = context; String messageType = gcm.getMessageType(intent); 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); } // Put the GCM message into a notification and post it. private void sendNotification(String msg) { mNotificationManager = (NotificationManager) ctx .getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, new Intent(ctx, MainActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( ctx).setSmallIcon(R.drawable.ic_launcher_temp) .setContentTitle("GCM Notification") .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } 

}

事情是,一切似乎都好,但消息永远不会到达。 有任何想法吗?? 提前致谢。

Solutions Collecting From Web of "使用适用于Android的Google Cloud Messaging无法接收消息(不是帮助程序库)"

在你的清单中添加以下内容

  <permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" /> <!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

您的清单缺less一些权限:

 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

编辑:

在你的清单中,你正在使用com.google.android.gcm.GCMBroadcastReceiver 。 这是一个从旧帮手库( gcm.jar )开始一个意向服务的类。 如果你想使用助手库,你应该在清单中定义意图服务。

如果您不想使用助手库,则应该将清单中的GCMBroadcastReceiver包更改为您在问题中包含的GCMBroadcastReceiver类的包。 否则,该类将不会被使用。

纠正上述问题后仍然没有推送消息。 问题是403错误。 看起来这个服务在古巴是不可用的,所以解决的方法是使用“你的自由”或“钍”等工具。

不要忘记把'com.example.gcm'改成你的包名,比如'com.yourdomain.yourapp'

您正在使用已被Google弃用的GCMBaseIntentService。 (但它应该仍然有效。)我遵循最新的教程http://developer.android.com/google/gcm/client.html并收到消息&#x3002; 你也可以试试。

另一个可能的原因是您可能收到一条消息,但没有成功显示在通知中。 在该方法中添加此行:sendNotification(String msg)

  Log.i(TAG, msg);