Yogie Soesanto
Yogie Soesanto

Reputation: 172

Device Doesn't Receive message from NEW Google Cloud Messaging (NEW GCM)

please help me i've been surfing about this topic , and still stack in this new GCM

my last project using GCM Push according this link

ht**://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

but now, the last GCM (C2DM) is deprecated, so we don't use any GCMRegistrar anymore

here, take a look at this h**p://developer.android.com/google/gcm/c2dm.html there is a statement "Android Cloud to Device Messaging (C2DM) is deprecated. The C2DM service will continue to be maintained in the short term, but C2DM will accept no new users, and it will grant no new quotas"

i use this link for learning the concept

and for the example i use : https://code.google.com/p/gcm/source/browse/#git

i think, i have followed every steps required

i have referenced my project to google play service lib

i also have changed my sender id to my google project number

i also have received RegID from GCM

but the problem is , whenever i click the send button

it never show me anything

from google documentation example, it says that it should ECHO back to my device, but it never does

i checked in documentation the concept says that gcmbroadcastreceiver will receive any GCM Message pushed to my device ,

so i tried to log inside the "OnReceive" in that broadcaster, but it never show anything

i also tried to implement HTTP GCM Server using this documentation http://developer.android.com/google/gcm/http.html

i get the response like this {"multicast_id":6256370624066466203,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1378114688323559%eab45603f9fd7ecd"}]}

but my log never shows anything

here is my broadcastreceiver

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.v("HAHA BANGET","masuk ke broadcastReceiver");

        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

and here is my intentservice

public class GcmIntentService extends IntentService {
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;

    public GcmIntentService() {
        super("7134XXXXX");
    }
    public static final String TAG = "HAHA";

    @Override
    protected void onHandleIntent(Intent intent) {

        Log.v(TAG,"MASUK INTENT NIH");

        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        // The getMessageType() intent parameter must be the intent you received
        // in your BroadcastReceiver.
        String messageType = gcm.getMessageType(intent);

        if (!extras.isEmpty()) {  // has effect of unparcelling Bundle
            /*
             * Filter messages based on message type. Since it is likely that GCM will be
             * extended in the future with new message types, just ignore any message types you're
             * not interested in, or that you don't recognize.
             */
            if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                sendNotification("Send error: " + extras.toString());
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
                sendNotification("Deleted messages on server: " + extras.toString());
            // If it's a regular GCM message, do some work.
            } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                // This loop represents the service doing some work.
                for (int i = 0; i < 5; i++) {
                    Log.i(TAG, "Working... " + (i + 1)
                            + "/5 @ " + SystemClock.elapsedRealtime());
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                    }
                }
                Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
                // Post notification of received message.
                sendNotification("Received: " + extras.toString());
                Log.i(TAG, "Received: " + extras.toString());
            }
        }
        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }

    // Put the message into a notification and post it.
    // This is just one simple example of what you might choose to do with
    // a GCM message.
    private void sendNotification(String msg) {
        mNotificationManager = (NotificationManager)
                this.getSystemService(Context.NOTIFICATION_SERVICE);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, PushBaruLagi.class), 0);

        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.common_signin_btn_icon_dark)
        .setContentTitle("GCM Notification")
        .setStyle(new NotificationCompat.BigTextStyle()
        .bigText(msg))
        .setContentText(msg);

        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }
}

and here is my manifest

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <receiver
        android:name="com.coba.pushgcmbaru.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.coba.pushgcmbaru" />
        </intent-filter>
    </receiver>
    <service android:name="com.coba.pushgcmbaru.GcmIntentService" />

    <activity
        android:name="com.coba.pushgcmbaru.PushBaruLagi"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

i'm using 2.2 FROYO

and i've updated my google play services to the newest one

so guys, if anyone could please help me , thanks a lot :)

Upvotes: 3

Views: 10503

Answers (2)

Erdinc Ay
Erdinc Ay

Reputation: 3273

// registration

int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

if (status == ConnectionResult.SUCCESS) {

    final GoogleCloudMessaging gcm =  GoogleCloudMessaging.getInstance(this);

    new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    gcm.register( Constants.GCM_SENDER_ID );

                    // old style google cloud messaging register process ----------------------
                    // Intent intent = new Intent( "com.google.android.c2dm.intent.REGISTER" );
                    // intent.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
                    // intent.putExtra("sender", Constants.GCM_SENDER_ID );
                    // startService( intent );
                    // ------------------------------------------------------------------------
                } 
                catch ( IOException e ) {   

                }
                catch ( Exception ex) {

                }
            }
    }).start();
}
else if (status != ConnectionResult.SUCCESS) {
    if (GooglePlayServicesUtil.isUserRecoverableError(status)) {        
        Toast.makeText(this, getString(R.string.error_gcm_installplayservices), Toast.LENGTH_SHORT).show();
        finish();
    }
    else {
        Toast.makeText(this, getString(R.string.error_gcm_devicenotsupported), Toast.LENGTH_SHORT).show();
        finish();
    }
}

// class for all responses

public class PushNotificationReceiver extends WakefulBroadcastReceiver implements IntentClientHubInterface {
    @Override
    public void onReceive(Context context, Intent intent) {
        if( intent != null && "com.google.android.c2dm.intent.REGISTRATION".equals(intent.getAction())) {

            String registrationId = intent.getStringExtra("registration_id");
            String error = intent.getStringExtra("error");

            if( error == null && context != null) {
                Utils.saveRegistrationID( context, registrationId );
            }

        }
        else if ( intent != null && "com.google.android.c2dm.intent.RECEIVE".equals(intent.getAction()) ) {     

            // handle notification          

        }
    }
}

// permissions

<?xml version="1.0" encoding="utf-8"?>
<manifest ...

    <permission android:name="YOUR.PROJECT.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="YOUR.PROJECT.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.SEND" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application ...

        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

        <receiver
            android:name=".PushNotificationReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter android:priority="100">
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="YOUR.PROJECT" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

Upvotes: 0

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Try this way

UPDATE : New GCM API implementation

1) create class GcmIntentService.java

public class GcmIntentService extends IntentService {

    public GcmIntentService() {
        super("your project id here");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // handle message here
    }

}

2) create class GcmBroadcastReceiver.java

public class GcmBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());
        context.startService((intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }

}

3) Mainfest.xml

pemissions for GCM

<permission
        android:name="your.package.name.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="your.package.name.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

<receiver
            android:name="your.package.name.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION" />

                <category android:name="your.package.name" />
            </intent-filter>
        </receiver>

        <service
            android:name="your.package.name.GcmIntentService"
            android:enabled="true" />

----------------------OLD API------------------------------------------------

public GcmIntentService() {
        super("72544799xxx"); //Pass GCM project id here
    }


<receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION" />

                <category android:name="com.coba.pushgcmbaru" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.coba.pushgcmbaru.GCMIntentService"
            android:enabled="true" />

Create GCMReceiver class and replace with your GcmBroadcastReceiver

import com.google.android.gcm.GCMBroadcastReceiver;

/**
 * This Class Contains All Method Related To GCMReceiver.
 * 
 * @author 
 * 
 */
public class GCMReceiver extends GCMBroadcastReceiver {

    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        return GCMIntentService.class.getName();
    }
}

Upvotes: 8

Related Questions