Pergunta

Embora eu tente outra resposta sobre esse problema, ele não pode ser resolvido.O ID do remetente está correto, as permissões foram adicionadas, a chave de API é verdadeira.

Eu uso este post para criar o projeto:http://developer.android.com/guide/google/gcm/gs.html#server-app

    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
      GCMRegistrar.register(this, SENDER_ID);
      regId = GCMRegistrar.getRegistrationId(this);
    } else {
      Log.v(TAG, "Already registered");
    }
    String did = getDeviceID();

ele retorna uma string vazia.

Foi útil?

Solução

Você tem GCMIntentService definiram corretamente no pacote raiz do seu aplicativo?

<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="my_app_package" />
  </intent-filter>
</receiver>

Certifique-se de que "my_app_package" é idêntico ao pacote principal do seu aplicativo, ou seu id retornará uma string vazia.

Observe também que

    GCMRegistrar.register(this, "...");

é assíncrono.Portanto, chamando GCMRegistrar.getRegistrationId(this) imediatamente depois disso não é confiável, então você deve evitá-lo.

O ID chegará via retorno de chamada de transmissão para o seu GCMIntentService, como parte do procedimento de registro.a partir daí, você pode armazenar a chave gcm/fcm em qualquer lugar que desejar e usá-la em outras partes do aplicativo (geralmente no servidor).

Outras dicas

Se seu aplicativo for iniciado pela primeira vez, você deverá aguardar o retorno de chamada OnRegistered em seu arquivo GCMIntentService.java.

GCMRegistrar.register(this, SENDER_ID);
// Android does NOT wait for registration ends and executes immediately line below
// So your regId will be empty.
regId = GCMRegistrar.getRegistrationId(this);

GCMIntentService.java:

@Override
protected void onRegistered(Context c, String regId) {
    // You can get it here!
}

Editar:A versão mais recente da biblioteca GCM (que acompanha a biblioteca de serviços do Google Play) aguarda resposta e retorna o ID de registro.Portanto, esta resposta é para bibliotecas GCM mais antigas.

Tenho o mesmo problema depois de 1 dia de luta e encontro a solução.Primeiro coloco meu código relacionado ao GCM em meu pacote principal e faço as alterações de acordo com meu pacote em androidManifest.xml

eu te dou um exemplo simples.O nome do meu projeto é GCMExample e tenho três pacotes 1.com.examle.GCMExample(Pacote Principal) , 2.com.examle.GCMExample.activity(Segundo Pacote) , 3.com.example.GCMExample.adapter (terceiro pacote)

Não estou obtendo ID de registro quando meu arquivo de classe relacionado ao GCM está em meu segundo pacote

Minha classe relacionada ao GCM como 1.GCMIntentService, 2.Utilitários de Servidor, 3.Utilitários Comuns 4.WakeLocker colocado em meu pacote principal com.example.GCMExample

também meu androidManifest.xml

     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.VIBRATE" />

     <permission android:name="com.example.GCMExample.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

     <uses-permission android:name="com.example.GCMExample.C2D_MESSAGE" />

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
        <!-- Receives the actual messages. -->
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <!-- Receives the registration id. -->
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

        <category android:name="com.example.GCMExample" />
      </intent-filter>
</receiver>  

<service android:name="com.example.GCMExample.GCMIntentService" />

Registrando o aplicativo com.example.ilkgcm dos remetentes "my_sender_id" - Este erro sugere que você não alterou seu 'my_sender_id' para um ID de remetente válido, que seria um código de 12 letras.

Se você não estiver obtendo resposta do registro, um dos principais motivos é que seu arquivo de manifesto não está configurado corretamente... especialmente forneça o "nome_do_pacote" (nome do pacote do seu aplicativo como com.xxx.yyy) no e corretamente.

Por exemplo, o nome da classe do seu receptor é:"MyCustomIntentService.java" , basta alterar esse nome para "GCMIntentService.java" e tentar novamente.Esta é uma solução simples.Basta alterar o nome do arquivo na área SRC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top