You need to check the source of your registration id, you can not use a C2DM registration id within a GCM message post. From Google's Doc :
C2DM and GCM are not interoperable. For example, you cannot post
notifications from GCM to C2DM registration IDs, nor can you use C2DM
registration IDs as GCM registration IDs. From your server-side
application, you must keep track of whether a registration ID is from
C2DM or GCM and use the proper endpoint.
As you transition from C2DM to GCM, your server needs to be aware of
whether a given registration ID contains an old C2DM sender or a new
GCM project number. This is the approach we recommend: have the new
app version (the one that uses GCM) send a bit along with the
registration ID. This bit tells your server that this registration ID
is for GCM. If you don't get the extra bit, you mark the registration
ID as C2DM. Once no more valid registration IDs are marked as C2DM,
you can complete the migration.
Another thing need to pay attention is the SENDER_ID, the format of SENDER_ID is the numeric one if you use InstanceID to get RegistrationID, like
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
The SENDER_ID could not use the project name, please use https://developers.google.com/mobile/add to get the "Server API Key" and the
"Sender ID".