It does not get registration id from GCM server the app does not give any error,this is my logcat.
07-13 16:43:39.920: I/** pushAndroidActivity **(5310): inside oncreate()
07-13 16:43:39.920: I/** pushAndroidActivity **(5310): started registration
07-13 16:43:39.920: D/GCMRegistrar(5310): resetting backoff for com.example.registration_id
07-13 16:43:39.920: V/GCMRegistrar(5310): Registering app com.example.registration_id of senders 803641917196
07-13 16:43:42.735: V/GCMBroadcastReceiver(5310): onReceive: com.google.android.c2dm.intent.REGISTRATION
07-13 16:43:42.735: V/GCMBroadcastReceiver(5310): GCM IntentService class: com.example.registration_id.GCMIntentService
07-13 16:43:42.735: V/GCMBaseIntentService(5310): Acquiring wakelock
This is the main Activity .i have used the existing gcm.jar file to use GCMRegistrar class methods.
package com.example.registration_id;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.app.Activity;
import com.google.android.gcm.GCMRegistrar;
public class MainActivity extends Activity {
private String TAG = "** pushAndroidActivity **";
EditText edittext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "inside oncreate() ");
//check if registered,if not get registration id from GCM server
if(GCMRegistrar.getRegistrationId(this).equals(""))
{
Log.i(TAG, "started registration ");
GCMRegistrar.register(this, "803641917206");
}
else
{
final String regId = GCMRegistrar.getRegistrationId(this);
Log.i(TAG, "registration id ===== "+regId);
edittext=(EditText)findViewById(R.id.msg);
edittext.setText(regId);
}
}
}
This is the service class-
package com.example.registration_id;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;
public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "===GCMIntentService===";
//default constructor
protected GCMIntentService(String senderId) {
super(senderId);
// TODO Auto-generated constructor stub
}
@Override
protected void onError(Context arg0, String arg1) {
// TODO Auto-generated method stub
Log.i(TAG, "error ");
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
}
@Override
protected void onRegistered(Context arg0, String registrationId) {
// TODO Auto-generated method stub
Log.i(TAG, "Device registered: regId = " + registrationId);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
// TODO Auto-generated method stub
}
}
onReceiver is being called which means you are getting a message back.
This is your problem. you must declare a public, no argument constructor for your GCMBaseIntentService subclass. Otherwise, your GCMIntentService class can’t be constructed and used properly by the background services.
Why?
because this protected constructor isn’t visible to the service class that handles all incoming intents, because it is in a different package.
Hardcode the senderId in a static constant in your GCMIntentService class because that will no longer change from google.