4

My Gcm Application receives fine message from GCM for Android 4 and higher. But below my application does not receive message.

This is the GcmBroadcastReceiver:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
        {
            // TODO Auto-generated method stub

            ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
            Log.i("GCM BROADCAST", "Begin Broadcast");

            startWakefulService(context, intent.setComponent(comp));

            setResultCode(Activity.RESULT_OK);
        }
}

This is the Intent:

public class GCMIntentService extends IntentService 
{
    public static final String TAG = "GcmIntentService";
    public static final int NOTIFICATION_ID = 1;

    public GCMIntentService()
        {
            super(Constant.SENDER_ID);
        }

/* (non-Javadoc)
 * @see android.app.IntentService#onHandleIntent(android.content.Intent)
 */
@Override
protected void onHandleIntent(Intent intent)
    {
        // TODO Auto-generated method stub

        Bundle extras = intent.getExtras();

        // Prendo l'istanza di Google Cloud Messaging
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

        // Prendo la stringa che mi indica il tipo di messaggio
        String messageType = gcm.getMessageType(intent);

        Log.i( TAG , "Messaggio ricevuto: " + extras.toString());

        if(!extras.isEmpty())
            {   
                // Azione nel caso il messaggio sia di errore
                if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
                    sendNotification("Send error: " + extras.toString());
                // Azione nel caso il messaggio sia riguardo l'eliminazione sul server
                else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType))
                    sendNotification("Deleted messages on server: " + extras.toString());
                // Azione nel caso sia un messaggio rigardante la nostra applicazione
                else if(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType))
                    {
                        sendNotification(extras.getString("message"));
                    }
            }

        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }

This is the manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gcmclient"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.gcmclient.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.example.gcmclient.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.gcmclient.broadcastreceivers" />
        </intent-filter>
    </receiver>
    <service android:name="com.example.gcmclient.GCMIntentService" />
    <service android:name="com.example.gcmclient.RegistrationService"></service>
    <receiver 
       android:name="com.example.gcmclient.broadcastreceivers.BootHandler"
       android:enabled="true"
       android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</application>

I can't understand why doesn't it work below Android 4? Thanks in advance.

paolo2988
  • 857
  • 3
  • 15
  • 31

1 Answers1

7

Change

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

to

<permission android:name="com.example.gcmclient.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcmclient.permission.C2D_MESSAGE" />

and

<receiver
    android:name="com.example.gcmclient.GcmBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.example.gcmclient.broadcastreceivers" />
    </intent-filter>
</receiver>

to

<receiver
        android:name="com.example.gcmclient.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.gcmclient" />
        </intent-filter>
    </receiver>
Eran
  • 387,369
  • 54
  • 702
  • 768
  • Thanks very much, it works now! Only for curiosity, what was the problem? – paolo2988 Nov 25 '13 at 19:12
  • 1
    You're welcome! You didn't define the GCM permissions and category of the receiver correctly. They should all match the main package of your app. For some reason this only causes problems in older Android versions. – Eran Nov 25 '13 at 19:55