2012-12-19 9 views
12

Śledziłem wersję demonstracyjną podaną pod numerem http://developer.android.com/google/gcm/gs.html i otrzymałem aplikację próbną, GCMTrial, aby działała poprawnie.Błąd Androida GCM. Serwer zwraca niezarejestrowany, gdy klient jest zarejestrowany pod numerem

Ale próbowałem wykonać te same kroki na istniejącej aplikacji, ale nie działa. Zrobiłem całkowicie nowy projekt. Ale nawet wtedy, po tych samych dokładnych krokach, nie mogłem uzyskać GCM, aby wysłać wiadomość z powodzeniem. Próbowałem zmienić nazwę GCMTrial na wymaganą nazwę, ale nie to też nie działa.

zarejestrować się na GCM poprzez głównej działalności i uzyskać następujące log:

12-19 21:30:13.102: V/GCMRegistrar(15889): Registering receiver 
12-19 21:30:13.112: D/GCMBaseIntentService(15889): handleRegistration: registrationId =   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, error = null, unregistered = null 
12-19 21:30:13.112: D/GCMRegistrar(15889): resetting backoff for com.XXX.XXX 
12-19 21:30:13.117: V/GCMRegistrar(15889): Saving regId on app version 1 

Ale gdy próbuję wysłać wiadomość GCM, zwraca następujący błąd

[ errorCode=NotRegistered ] 

kod klienta:

public class MainActivity extends Activity { 
TextView tve; 
String TAG = "GCMTrial"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GCMRegistrar.checkDevice(this); 
    GCMRegistrar.checkManifest(this); 
    final String regId = GCMRegistrar.getRegistrationId(this); 
    if (regId.equals("")) { 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } else { 
     Log.v(TAG, "Already registered"); 
    } 
} 

GCMIntentService : 
public class GCMIntentService extends GCMBaseIntentService { 
@Override 
protected void onError(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 
@Override 
protected void onMessage(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 
    Log.d("GCM", "RECIEVED A MESSAGE"); 
    // Get the data from intent and send to notificaion bar 
} 
@Override 
protected void onRegistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 
@Override 
protected void onUnregistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 
} 

}

Oczywisty:

Kod

Serwer:

System.out.println("Sending GCM"); 
    String key = "XXX"; //Server API key taken from the site 
    clientID = "XXXXXXXXX"; // copied from the logs 
    Sender sender = new Sender(key); 
    Message message = new Message.Builder().build(); 
    Result result = sender.send(message, clientID, 1); 
    System.out.println(result.toString()); 

To doprowadza mnie do szaleństwa .. To pokazuje, jak zarejestrowane w telefonie z systemem Android, nawet nazywa onRegistered metodę klasy GCMIntentService .. ale gdy próbuję wysłać wiadomość, to flagi jest „NotRegistered błąd” ... nie wiem co robię źle .. proszę mi pomóc faceci ....

+0

Nie mam pojęcia, co się dzieje. Ale, ponownie zainstalowałem dodatki GCM dla Androida, stworzył zupełnie nową aplikację, i tym razem działa !! :) Użyłem MulticastResult result = sender.send (wiadomość, urządzenia, 5); zamiast wyniku Result = sender.send (message, clientID, 1); dunno, jeśli to był problem, ale teraz działa ...! – user1657709

+0

Myślę, że powód, dla którego otrzymujesz to działa po ponownym zainstalowaniu, ponieważ masz już zgłoszenie nowego identyfikatora Reg. – neferpitou

Odpowiedz

0

zapomniałeś dodać konstruktora w swojej GCMIntentService

dodać następujące do listy GCMIntentService

public GCMIntentService(){ 
     super(SENDER_ID); 
    } 

SENDER_ID to XXXXXXX, który służy do rejestracji aplikacji.

+0

Próbowałem, aby .. Serwer nadal wysyła błąd "NotRegistered" ..... Wszelkie inne sugestie ???? – user1657709

+0

W moim przypadku dodałem sender_ID, który dostarczył mi google do żądania wysłanego z serwera. Ale użyłem ASP.Net do wysłania żądania. –

+0

To dla nie SENDER_ID, to nazwa THREAD i nie musi być SEND_ID może to być dowolny ciąg. – neferpitou

11

Cóż, wiem, że jest to aktualny błąd podczas instalacji z adb.

GCMRegistrar nie wie, że urządzenie jest niezarejestrowane na serwerze GCM i nie rejestruje się.

Co można zrobić, to w każdym razie zarejestrować:

if (regId.equals("")) { 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } else { 
     //I SAY BULLSHIT ! 
     GCMRegistrar.register(this, "XXXXXX"); 
     Log.v(TAG, "Reg"); 
    } 

Albo Uninstal aplikacji na kliencie uruchom od nowa zainstalować ADB.

Należy pamiętać, że jest kilka szans, że tak się stanie podczas produkcji.

0

Możesz spróbować zastąpić kontekst "ten" na "getApplicationContext()", aby użyć kontekstu aplikacji. Oto mój przykładowy kod:

private void registerGCM() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { 
     //prevent crash caused by no google account or not support for gcm 
     try { 
      GCMRegistrar.checkDevice(this); 
     } catch (Exception e) { 
      Log.i("test", "!!!cgm " + e.toString()); 
      return; 
     } 
    } 

    final String regId = GCMRegistrar.getRegistrationId(this); 
    if (TextUtils.isEmpty(regId)) { 
     String gcmSenderId = PreferencesUtil.getStringPreference(PreferencesUtil.SETTING_GCM_SENDER_ID, 
       "", getApplicationContext()); 
     GCMRegistrar.register(getApplicationContext(), gcmSenderId); 
    } 
    mGCMRegisted = true; 
} 
Powiązane problemy