Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't receive messages using Google Cloud Messaging for Android (not the helper library)

Does anybody can help me with a working example for receiving messages from gcm using Google Cloud Messaging for Android. I have tried both ways (helper library and GoogleCloudMessaging class) and nothing seems to work. I'm using a PHP script that shows the following:

Multicast ID: 5.2108110103215E+18 Number of messages processed successfully: 1 Number of messages with processing errors: 0 Canonical IDs: 0

So apparently everithing is OK. I could register the device in both ways, using the helper library (gcm.jar) and using GoogleCloudMessaging class. The problem is that there is no way the message I send via PHP arrives, or at least I don't know how to handle it correctly. Here are the permissions and the receiver from my manifest:

<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" />

Finally here is the service class

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) {
    //...

}
}

Here is the code when using the GoogleCloudMessaging class (I changed the manifest to use the custom receiver):

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());
}

}

The thing is that everything seems to be ok, but the message never arrives. Any ideas?? Thanks in advance.

like image 908
Alejandro Casanova Avatar asked Jul 01 '13 03:07

Alejandro Casanova


1 Answers

Add the following in your manifeast

 <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" />
like image 71
strike Avatar answered Oct 16 '22 09:10

strike