Android GCM: no obtener el token de registro en el método onCreate ()

Estoy incorporando GCM para la notificación push en mi aplicación. Estoy enfrentando un problema muy extraño, en la primera ejecución no puedo conseguir el token de registro de GCM, pero cuando ejecutas mi segunda aplicación de la aplicación obtendrás la impresión de ID de registro en la consola. No sé qué estoy haciendo worng. Esto es lo que he hecho hasta ahora.

Este es mi método onCreate () donde quiero imprimir GCID regID:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final String regId = GCMRegistrar.getRegistrationId(this); GCM_regID = regId; System.out.println("GCM regId: "+GCM_regID); 

Haciendo el siguiente código dentro de onCreate ():

 /** * Google Cloud Messaging - Getting server Url and device ID to send it * across Google server for the notification.. */ mGCMReceiver = new GCMReceiver(); mOnRegisteredFilter = new IntentFilter(); mOnRegisteredFilter.addAction(Constants.ACTION_ON_REGISTERED); if (Constants.SENDER_ID == null) { // mStatus.setText("Missing SENDER_ID"); return; } if (Constants.SERVER_URL == null) { // mStatus.setText("Missing SERVER_URL"); return; } GCMRegistrar.checkDevice(this); GCMRegistrar.checkManifest(this); if (!regId.equals("")) { sendIdToServer(regId); } else { GCMRegistrar.register(getApplicationContext(), Constants.SENDER_ID); } sendIdToServer(regId); } 

Enviando GCM_regId al servidor a través de este método como se indica en uno de los tutoriales:

 /** * GCM - sending the data in json format to server db * */ public void sendIdToServer(String regId) { (new SendRegistrationIdTask(regId)).execute(); GCM_regID = regId; } private class GCMReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String regId = intent .getStringExtra(Constants.FIELD_REGISTRATION_ID); token = regId; } } private final class SendRegistrationIdTask extends AsyncTask<String, Void, HttpResponse> { // private String mRegId; public SendRegistrationIdTask(String regId) { // mRegId = regId; } @Override protected HttpResponse doInBackground(String... regIds) { // String url = Constants.SERVER_URL + "/register"; return null; } @Override protected void onPostExecute(HttpResponse response) { if (response == null) { return; } StatusLine httpStatus = response.getStatusLine(); if (httpStatus.getStatusCode() != 200) { Log.e(Constants.TAG, "Status: " + httpStatus.getStatusCode()); return; } } } 

No lo creo, GCMIntentService clase es necesaria aquí para mi problema. Por favor, mire esto y ayúdeme a salir de este problema.

Puedo imprimir en la clase de GCMIntentService, encendido onRegistered (). Aquí va:

 @Override protected void onRegistered(Context context, String regId) { Intent intent = new Intent(Constants.ACTION_ON_REGISTERED); intent.putExtra(Constants.FIELD_REGISTRATION_ID, regId); context.sendBroadcast(intent); } 

Tengo que imprimir el regId en MainActivity, en onCreate ().

Registrar el dispositivo tardará algún tiempo .. Así que si intenta recuperar el ID de registro inmediatamente después de registrar el dispositivo en onCreate (), entonces cada vez que devolverá un valor nulo .. Así que intente registrar su dispositivo dentro de onCreate () y recuperar el identificador en cualquier actividad / servicio diferente (puede recuperar la identificación de la clase GCMIntentService la api de GCM). Nota del método GCM Intent Categoría de servicio.

  protected void onRegistered(Context arg0, String arg1) { Logger.d(arg0, "REG ID="+arg1); regID = arg1; } 

Este es el método que se llama después de Reg se hace. Así que para mi caso el regID i tomó esto como una cadena estática y estoy accediendo a ella más. OR Como u quiere el regID en la actividad B se prefiere registrarlo en la actividad A y recuperarla a través de la cadena estática en el método anterior de la clase GCMIntent.

La razón por la que no obtiene el regID la primera vez que ejecuta la aplicación es porque su aplicación no tiene un regID todavía, debe pedir a los servidores GCM para ello. Así que cuando llame a final String regId = GCMRegistrar.getRegistrationId(this); la primera vez que devolverá una cadena vacía. Sin embargo, una vez que se haya registrado con GCM la próxima vez que realice esa llamada (la próxima vez que comience la aplicación), su regID se devolverá. El tarro de GCM simplemente almacena el regID como una cadena en los prefs de la aplicación.

Cuando los servidores de GCM registren su dispositivo, lo sabrán cuando se GCMIntentService.OnRegistered() . En su código está difundiendo una intención con su regID en el GCMIntentService.OnRegistered() que supongo que desea manejar con su GCMReceiver (?), Aunque en el ejemplo de código que ha mostrado no veo la creación de una instancia de la clase o registrándolo como un receptor.

Lo que creo que va a querer en GCMReceiver.onReceive() es llamar a sendIdToServer() con el regID que obtuvo de la intención. p.ej

 @Override public void onReceive(Context context, Intent intent) { String regId = intent .getStringExtra(Constants.FIELD_REGISTRATION_ID); Log.i("regID: ", regId); sendIdToServer(regId); } 

Tenemos una muestra de cliente GCM / Airbop que quizás quiera ver. Se basa en la aplicación de demostración de GCM a la que debe echarle un vistazo.

Si no has iniciado sesión en una cuenta de Google en el emulador, no funcionará. Intente iniciar sesión con una cuenta válida de Google (gmail) y ver.

  • ¿Cómo supera WhatsApp el retardo de notificaciones de GCM Push?
  • Error de autorización de GCM http 401
  • Aclaración de setUpdateCurrent en OneOffTask
  • Android GCM con sabores de producto
  • Obtenga el valor de RemoteMessage del método FCM onMessageReceived
  • Los dispositivos Android 4.x reciben mensajes GCM, pero los dispositivos Android 2.3
  • SecurityException: No se le permite iniciar el servicio Intención act = com.google.android.c2dm.intent.REGISTER
  • GCM Network Manager - Tarea periódica no disparando
  • FCM con AWS SNS
  • Aplicación para Android que comienza lentamente - dex2oat El código postal está ausente. Cancelado - Gradle 2.10
  • Diferentes sabores con GCM
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.