play notification google gcm app android google-cloud-messaging service-not-available

google - send push notification to android



Google Cloud Messaging-GCM-SERVICE_NOT_AVAILABLE (6)

Estoy intentando, para implementar el nuevo GCM, estoy siguiendo las indicaciones de Google: http://developer.android.com/guide/google/gcm/gs.html

Me quedo atascado en obtener mi ID de registro del dispositivo!

Mi aplicación sigue intentando conectarse con el servidor de Google, aquí mis registros de errores:

onReceive: com.google.android.gcm.intent.RETRY GCM IntentService class: com.dombox.app.GCMIntentService Acquiring wakelock [GCMIntentService] start Registering app com.dombox.app of senders _my_sender_id_ Releasing wakelock onReceive: com.google.android.c2dm.intent.REGISTRATION GCM IntentService class: com.dombox.app.GCMIntentService Acquiring wakelock [GCMIntentService] start handleRegistration: registrationId = null, error = SERVICE_NOT_AVAILABLE, unregistered = null Registration error: SERVICE_NOT_AVAILABLE Scheduling registration retry, backoff = 912617 (768000) Releasing wakelock

Aquí está mi código de actividad, pidiendo una identificación:

try{ Log.i(TAG, "[checkNotifRegistration] checkDevice"); GCMRegistrar.checkDevice(this); Log.i(TAG, "[checkNotifRegistration] checkManifest"); GCMRegistrar.checkManifest(this); if (GCMRegistrar.isRegistered(this)) { Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this)); } final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { // SENDER_ID is my project id into google account url GCMRegistrar.register(this, SENDER_ID); Log.i(TAG, "[checkNotifRegistration] reg id : "+GCMRegistrar.getRegistrationId(this)); } else { Log.i(TAG, "[checkNotifRegistration] already registered as : " + regId); } } catch(Exception e){ Log.e(TAG, "[checkNotifRegistration] Exception : "+e.getMessage()); e.printStackTrace(); }

Aquí mi código de servicio

public class GCMIntentService extends GCMBaseIntentService { private static final String TAG = "GCMIntentService"; public GCMIntentService() { super(SENDER_ID); // SENDER_ID is my project id into google account url // TODO Auto-generated constructor stub Log.d(TAG, "[GCMIntentService] start"); } public GCMIntentService(String senderId) { super(senderId); // TODO Auto-generated constructor stub Log.d(TAG, "[GCMIntentService] start - sender Id : "+senderId); } }

Y aquí está mi manifiesto de Android:

<permission android:name="com.dombox.app.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.dombox.app.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <application android:icon="@drawable/icon" android:label="@string/app_name" > <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" /> <category android:name="com.myapp.app" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" android:enabled="true"/> <activity android:name=".activity.Myapp" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

Estoy siguiendo las instrucciones de Google, pero seguí con el error de SERVICE_NOT_AVAILABLE,

Qué estoy haciendo mal ?


El problema no estaba relacionado con el código, sino con el enlace al teléfono de prueba. El teléfono de prueba no tiene una tarjeta SIM y el reloj no estaba configurado . Así que Google no puede volver a registrarlo con un tiempo equivocado.

Logro tener una ID de registro utilizando un dispositivo virtual Android, con la API de Google y configurando el reloj del teléfono de prueba .


He tenido este problema y fue causado por la conexión WIFI. Apagué el WIFI e hice la prueba nuevamente (en 3g) y funcionó. Luego volví a encender el WIFI y volví a tener el error. Volver a 3g, para asegurarse, y funcionó de nuevo.

Entonces, en conclusión, el problema fue causado por la conexión.


Recuerde que si está detrás de un firewall corporativo, es posible que algunos puertos que utiliza GCM no puedan comunicarse a través de la red inalámbrica local. Tuve este problema al intentar que mi emulador funcionara inicialmente. Tuve que obtener una IP especial que permitiera los puertos enumerados a continuación.

Nota: si su organización tiene un servidor de seguridad que restringe el tráfico hacia o desde Internet, debe configurarlo para permitir la conectividad con GCM para que sus dispositivos Android puedan recibir mensajes. Los puertos que se abren son: 5228, 5229 y 5230. GCM generalmente solo usa 5228, pero a veces usa 5229 y 5230. GCM no proporciona IP específicas, por lo que debe permitir que su firewall acepte conexiones salientes a todas las direcciones IP contenidas en los bloques de IP listados en el ASN de Google de 15169.

http://developer.android.com/google/gcm/gcm.html


Tuve este problema ... mi solución fue deshabilitar la conexión a Internet y usar el servicio telefónico.


Tuve este problema ejecutando mi aplicación en genymotion. Instalar servicios de Google Play como dice here y todo funcionó bien.


android:enabled="true"

Eliminar esto ^

Si aún no has añadido esto a tu manifiesto.

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"

No necesita el segundo constructor en GCMIntentService. solo este

public GCMIntentService() { super(SENDER_ID); }

Asegúrese de que su SENDER_ID sea el número copiado de la URL de su navegador mientras navega por el sitio web del código de Google Y navega por el servicio GCM.