studio services play notification google gmc gcm developer android android-2.2-froyo google-cloud-messaging google-play-services service-not-available

services - push notifications android



GCM SERVICE_NOT_AVAILABLE en Android 2.2 (9)

Recibo el error "SERVICE_NOT_AVAILABLE" en mi llamada GoogleCloudMessaging.register () en un dispositivo Android 2.2.

Estoy escribiendo una aplicación que utiliza GoogleCloudMessaging con los nuevos servicios de Google Play. Lo implementé siguiendo las pautas proporcionadas en el sitio web de Android y mi fuente contiene una gran cantidad de códigos de verificación y manejo de errores, como asegurarse de que los Servicios de Google Play estén instalados o actualizados. El código de registro de GCM también implementa un retroceso exponencial como google como sugerido para implementar para manejar el error SERVICE_NOT_AVAILABLE.

He probado mi aplicación en una amplia gama de dispositivos que incluyen ICS, JB, Honey Comb e incluso dispositivos 2.3.x. El registro de GCM funciona y puedo enviarle mensajes a través de GCM. Sin embargo, en un dispositivo 2.2 recibo continuamente un error SERVICE_NOT_AVAILABLE en la llamada GoogleCloudMessaging.register () incluso con el retroceso exponencial en su lugar.

El dispositivo en el que GCM está fallando es un Samsung SGH-I896 para ser exactos y el teléfono tiene 2 cuentas de Google. He leído que este error puede deberse a una hora mal configurada, pero la hora está configurada para ser automática. El teléfono no está modificado y se está ejecutando en stock Samsung ROM.

También he intentado reiniciar el dispositivo y reinstalar los servicios de Google Play sin suerte. Cualquier ayuda en este tema será muy apreciada.

EDITAR: Intenté implementar GCM utilizando el antiguo gcm.jar y GCMRegistrar y terminó trabajando en el dispositivo. Sin embargo, casi no considero que sea una buena solución al problema, ya que Google ha dejado de admitir este método afaik.

EDIT2: ver la respuesta aceptada.


Después de leer la publicación de , probé el código a continuación y obtuve mi Actividad para recibir un registro. Solo agrega esto:

<activity android:name=".MyActivity" ... /> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="your.package.here" /> </intent-filter> </activity>

en tu AndroidManifest.xml


Experimenté el mismo problema. GCM funciona bien en mi tableta con Android 4.04, pero siempre recibió un SERVICE_NOT_AVAILABLE en mi teléfono inteligente con Android 2.3.

Encontré que la siguiente solución no usa (por lo que sé) ninguna clase en desuso. Agregue la acción "com.google.android.c2dm.intent.REGISTRATION" al GCMBroadcastReceiver en su manifiesto. Esto permitirá recibir el registration_id en su GCMBroadcastReceiver.

<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" /> <category android:name="YOUR_PACKAGE_NAME" /> </intent-filter> </receiver>

Después de eso, su GCMBroadcastReceiver puede recibir el ID de registro:

public void onReceive(Context context, Intent intent) { String regId = intent.getExtras().getString("registration_id"); if(regId != null && !regId.equals("")) { /* Do what ever you want with the regId eg. send it to your server */ } }

Aunque todavía recibo un error de SERVICE_NOT_AVAILABLE, puedo manejar el ID de registro en mi GCMBroadcastReceiver y puedo enviar mensajes a mi teléfono inteligente. Bastante raro, pero funciona para mí.


Por el momento, hasta que Google arregle este error o alguien proporcione una solución mejor, estoy usando una solución híbrida en la que usará los servicios de Google Player las primeras veces (con retroceso exponencial), pero luego cambiaré a GCMRegistrar.


Por lo tanto, hay otra cosa a tener en cuenta que me hizo tropezar. Lo tenía funcionando bien en el emulador + con la aplicación de prueba, pero luego tuve problemas para implementarlo en dispositivos reales.
Recibió constantemente el error SERVICE_NOT_AVAILABLE y recurrió a un enfoque similar al de la respuesta anterior:

IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "Got into onReceive for manual GCM retrieval. " + intent.getExtras()); String regId = intent.getStringExtra("registration_id"); if (regId != null && !regId.isEmpty()) { theResult.add(regId); } else { theResult.add(""); } lastDitchEffortComplete = true; } }; cont.registerReceiver(receiver, filter);

Este tipo de trabajo funcionó. Pero tomó una cantidad de tiempo extrañamente larga para recibir esta información, y en un ciclo de espera que tenía, SOLO lo recuperaría SOLAMENTE después de que me hubiera dado por vencido y dejara que las cosas siguieran.

Esto me hizo pensar que podría haber otra causa para el mensaje SERVICE_NOT_AVAILABLE.

Este es el código que tuve que hacer para obtener / registrar con GCM:

new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Override protected Void doInBackground(Void... params) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Starting GCM Registration Attempt #" + count); registrationId = gcm.register(CLOUDAPPID); rph.storeRegistrationId(registrationId); return null; } catch (IOException e) { e.printStackTrace(); } Log.w(TAG, "Registration failed. Retrying in " + timeSleep + " ms."); try { Thread.sleep(timeSleep); } catch (InterruptedException e) { } } return null; } }.execute().get();

Lo principal a buscar aquí es la última línea.

.execute.get();

Una forma "inteligente / engañosa" de bloquear resultados asíncronos fuera del hilo.

Resulta que eso es lo que está causando el problema. Tan pronto como acabo de tener:

.execute();

Déjelo pasar, e hizo que el algoritmo / código funcionara al informar de nuevo y no necesitar la identificación de registro de inmediato, entonces estaba bien. Ni siquiera necesitaba el receptor de transmisión manual, simplemente funcionaba como debería.


Sé que esta es una publicación antigua, pero acabo de tener el mismo problema, mientras que todo se configuró correctamente. El error SERVICE_NOT_AVAILABLE, siguió apareciendo. Después de ir a settings => apps => Google Play-servises, y borrar la caché y eliminar los datos, funcionó.


SERVICE_NOT_AVAILABLE puede ser causado por un GooglePlayServices antiguo o faltante. Use GooglePlayServicesUtil para verificar la versión y, si el redireccionamiento es incorrecto, el usuario puede instalarlo manualmente. Esto solucionará el SERVICE_NOT_AVAILABLE y también obtendrá todas las mejoras y correcciones de errores (y nuevos errores :-).

Si no puede hacer esto, no tiene sentido usar el registro (), el método espera que el servicio de reproducción correspondiente recupere el resultado. Genera la misma emisión, por compatibilidad con versiones anteriores. Usar la intención de REGISTRO directamente o la biblioteca en desuso continuará funcionando. Sugeriría usar la intención, GCMRegistrar está vinculado a la implementación anterior en GoogleServicesFramework (tiene una llamada a intent.setPackage (GSF_PACKAGE)), por lo que no puede beneficiarse De cualquier corrección.

Tener la última versión de GCM, al utilizar GooglePlayServicesUtil para tratar con dispositivos que no se instalaron automáticamente, puede ayudar no solo al registro.


Si la respuesta marcada no funciona para usted (como lo fue para mí), verifique a la persona que está frente a su dispositivo, tal vez agítela y luego habilite la conexión a Internet. Trabajó para mi ;-)

Sin internet, recibes la misma excepción y pasé la tarde persiguiendo problemas complejos con el servicio ...


También se me ocurrió este error, pero lo hizo porque estaba tratando de registrarme en el GCM a través de un firewall de mi empresa. Y en la documentación encontré:

"Nota: si su organización tiene un firewall 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 normalmente 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 enumerados en el ASN de Google 15169. "

Una vez que abrí los puertos o probé desde otra red, funcionó.


Tuve el mismo problema pero estaba sucediendo en todos los dispositivos. Me llevó una eternidad encontrar mi problema, pero pensé que lo publicaría en caso de que coincidiera con el caso de otra persona. Aquí está una versión simplificada de mi problema:

public class Login extends Activity { Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); context = getApplicationContext(); //Get GCM registration id new GcmRegistrationAsyncTask().execute(context); Set<Tuple> timeline = new HashSet<Tuple>(); try { //Get data from Redis database timeline = new RedisAsyncTask().execute(context).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }

Cuando agrego la segunda AsyncTask con una devolución usando get (), obtendría el GCM ''SERVICE_NOT_AVAILABLE'' cada vez que pese a que aún podría recuperar el ID de registro del GcmBroadcastReceiver onReceive (). Sin embargo, cuando corro:

public class Login extends Activity { Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); context = getApplicationContext(); new GcmRegistrationAsyncTask().execute(context); new RedisAsyncTask().execute(context); } }

El GCM recibiría el ID de registro sin problema.