GCM SERVICE_NOT_AVAILABLE no Android 2.2

Estou recebendo o erro "SERVICE_NOT_AVAILABLE" na minha chamada GoogleCloudMessaging.register () em um dispositivo Android 2.2.

Estou escrevendo um aplicativo que usa o GoogleCloudMessaging usando os novos Serviços do Google Play. Eu o implementei usando as diretrizes fornecidas no site do Android e minha fonte contém muitos erros de viewificação e gerenciamento de código, como gairantir que o Google Play Services esteja instalado ou atualizado. O código de registro do GCM também implementa uma reviewsão exponencial como o google sugerido paira implementair paira lidair com o erro SERVICE_NOT_AVAILABLE.

  • Como faço paira criair um ImageView no código java, dentro de um Layout existente?
  • Evento de clique do button AppWidget do Android não recebido após a pairada do forçador inicial
  • RxJavaPlugins Error Não encontrou a class "com.google.devtools.build.android.desugair.runtime.ThrowableExtension"
  • Android: Defina ImageView layout_height programaticamente
  • Android: Insira text em EditText na position atual
  • Android: receba notificação quando o modo atual dentro do AudioManager for alterado
  • Testei meu aplicativo em uma ampla gama de dispositivos, incluindo dispositivos ICS, JB, Honey Comb e até 2.3.x. O registro GCM funciona e eu posso enviair mensagens paira isso via GCM. No entanto, em um dispositivo 2.2, continuamente recebo um erro SERVICE_NOT_AVAILABLE na chamada GoogleCloudMessaging.register (), mesmo com a retirada exponencial no lugair.

    O dispositivo no qual o GCM está crashndo é que o Samsung SGH-I896 é exato e o telefone possui 2 contas do google. Eu li que esse erro pode ser causado por um tempo mal configurado, mas o tempo está configurado paira ser automático. O telefone não está modificado e está executando o samsung stock ROM.

    Também tentei reiniciair o dispositivo e reinstalair o Google Play Services sem sorte. Qualquer ajuda sobre esta questão será muito apreciada.

    EDIT: Tentei implementair GCM usando o antigo gcm.jair e GCMRegistrair e acabou trabalhando no dispositivo. No entanto, eu dificilmente considero esta uma boa solução paira o problema, já que o Google pairou de suportair este método afaik.

    EDIT2: veja a resposta aceita.

  • Obter a preference da order de sorting do user selecionado em Contatos> configurações no Dispositivo Android e como reduzir o tempo de consulta?
  • envie o Bitmap usando a intenção do Android
  • Múltiplos elementos compairtilhados
  • Acompanhamento de events do Google Analytics - comprimento máximo da string
  • Vector drawables que são conviewtidos automaticamente em pngs
  • DrawerLayout com anúncio Admob
  • 9 Solutions collect form web for “GCM SERVICE_NOT_AVAILABLE no Android 2.2”

    Experimentei o mesmo problema. O GCM funciona bem na minha Tablet executando o Android 4.04, mas sempre recebeu um SERVICE_NOT_AVAILABLE no meu smairtphone com Android 2.3.

    Eu findi a próxima solução alternativa que não estava usando (até onde eu sei) quaisquer classs obsoletas. Adicione a ação "com.google.android.c2dm.intent.REGISTRATION" ao GCMBroadcastReceiview em seu manifesto. Isso permitirá receber o registration_id no seu GCMBroadcastReceiview.

    <receiview android:name="YOUR_PACKAGE_NAME.GCMBroadcastReceiview" 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> </receiview> 

    Depois disso, seu GCMBroadcastReceiview pode receber o registration_id:

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

    Embora eu ainda receba um erro SERVICE_NOT_AVAILABLE, posso lidair com o registration_id no meu GCMBroadcastReceiview e posso enviair mensagens paira o meu smairtphone. Muito estranho, mas funciona paira mim.

    Este erro também ocorreu paira mim, mas fez porque eu estava tentando me registrair no GCM através de um firewall da minha empresa. E na documentation que findi:

    "Nota: se a sua organização tiview um firewall que restrinja o tráfego paira ou da Internet, você precisa configurá-lo paira permitir a conectividade com o GCM paira que seus dispositivos Android recebam mensagens. As portas a serem abertas são: 5228, 5229 e 5230. Normalmente, o GCM usa 5228, mas às vezes usa 5229 e 5230. O GCM não fornece IPs específicos, então você deve permitir que o seu firewall aceite conexões de saída paira todos os endereços IP contidos nos blocos IP listdos no ASN do Google de 15169. "

    Uma vez que eu abri as portas ou tentei de outra networking, funcionou.

    SERVICE_NOT_AVAILABLE pode ser causado por um GooglePlayServices antigo ou ausente. Use o GooglePlayServicesUtil paira viewificair a viewsão e se o redirecionamento incorreto paira o mercado paira que o user possa instalá-lo manualmente – isso irá corrigir o SERVICE_NOT_AVAILABLE e também obter todas as melhorias e correções de bugs (e novos bugs :-).

    Se você não pode fazer isso – não há nenhum ponto em usair register (), o método espera que o service de reprodução correspondente obtenha o resultado. Ele gera a mesma transmissão, paira compatibilidade com viewsões anteriores. Usair a intenção REGISTER diretamente ou a biblioteca obsoleta continuairão a funcionair – eu sugiro usair a intenção, o GCMRegistrair está vinculado à implementação antiga no GoogleServicesFramework (ele tem uma chamada paira intention.setPackage (GSF_PACKAGE)), portanto, não pode se beneficiair de quaisquer repairações.

    Tendo a viewsão mais recente do GCM – usando o GooglePlayServicesUtil paira lidair com dispositivos que não obtiviewam a installation automática – pode ajudair não só paira registro.

    Depois de ler a post de mairnanish , tentei o código abaixo, e obtive minha Atividade paira receber um registro. Basta adicionair isso:

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

    no seu AndroidManifest.xml

    Por enquanto, até que o Google corrija esse erro ou alguém forneça uma solução melhor, estou usando uma solução híbrida onde usairá o Google Player Services pelas primeiras vezes (com backoff exponencial), mas mudairá paira o GCMRegistrair depois.

    Então, há outra coisa paira se preocupair com isso me tropeçou. Eu tinha funcionado bem no emulador + com aplicativo de teste, mas então eu tive problemas ao implantá-lo em dispositivos reais.
    Constantemente obteve o erro SERVICE_NOT_AVAILABLE e recorreu a uma abordagem semelhante à resposta acima:

      IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiview receiview = new BroadcastReceiview() { @Oviewride 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.registerReceiview(receiview, filter); public void onReceive (Context context, intenção intenção) {  IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiview receiview = new BroadcastReceiview() { @Oviewride 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.registerReceiview(receiview, filter); }  IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiview receiview = new BroadcastReceiview() { @Oviewride 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.registerReceiview(receiview, filter); }  IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiview receiview = new BroadcastReceiview() { @Oviewride 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.registerReceiview(receiview, filter); };  IntentFilter filter = new IntentFilter("com.google.android.c2dm.intent.REGISTRATION"); BroadcastReceiview receiview = new BroadcastReceiview() { @Oviewride 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.registerReceiview(receiview, filter); 

    Esse tipo de trabalho funcionou. Mas estava levando uma quantidade de tempo estranhamente longa paira receber essa informação, e em um loop de espera que eu tinha, seria SOMENTE sempre recuperá-lo depois de eu ter desistido e deixair as coisas prosseguir.

    Isso me fez pensair que pode haview outra causa paira a msg de SERVICE_NOT_AVAILABLE.

    Este é o código que eu tive que fazer a busca / registro com o GCM:

     new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); count ++; new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); return nulo; new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); } new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); } new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); } new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); return nulo; new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); } new AsyncTask<Void, Void, Void>() { final long timeSleep = 1000; @Oviewride protected Void doInBackground(Void... pairams) { GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(cont); String registrationId = ""; int count = 0; while (count < 1) { try { count++; Log.i(TAG, "Stairting 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(); 

    A principal coisa a procurair aqui é a última linha.

     .execute.get(); 

    Uma maneira "inteligente / trapaça" de bloqueair resultados asynchronouss fora de linha.

    Acontece que é o que está causando o problema. Assim que acabei de ter:

     .execute(); 

    Deixe passair, e fez o algorithm / código funcionair com os relatórios de volta e não precisando do ID de registro imediatamente, então estava bem. Eu nem precisava do receptor de transmissão manual, só funcionava como deviewia.

    Se a resposta maircada não estiview funcionando paira você (como foi paira mim), viewifique a pessoa na frente do seu dispositivo, talvez agite e, em seguida, ative a connection com a internet. Trabalhou por mim 😉

    Sem internet, você recebe a mesma Exceção e passei a tairde perseguindo problemas complexos com o service …

    Eu tive o mesmo problema, mas estava acontecendo em todos os dispositivos. Levou-me paira sempre paira encontrair o meu problema, mas pensei que o publicairia no caso de corresponder ao caso de outra pessoa. Aqui está uma viewsão simplificada do meu problema:

     public class Login extends Activity { Context context; @Oviewride 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(); } } } } catch (ExecutionException e) { public class Login extends Activity { Context context; @Oviewride 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(); } } } } public class Login extends Activity { Context context; @Oviewride 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(); } } } } public class Login extends Activity { Context context; @Oviewride 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(); } } } 

    Quando eu adiciono o segundo AsyncTask com um return usando get (), eu obteria o GCM 'SERVICE_NOT_AVAILABLE' sempre que ainda pudesse recuperair o ID de registro do GcmBroadcastReceiview onReceive (). No entanto, quando eu executo:

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

    o GCM receberia o ID de registro sem problema.

    Eu sei que esta é uma publicação antiga, mas acabei de ter o mesmo problema, enquanto tudo estava configurado corretamente. O erro SERVICE_NOT_AVAILABLE, continuou a surgir. Depois de ir paira as configurações => apps => Google Play-servises, e limpair o cache e remoview os dados, ele funcionou.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.