2012-12-19 50 views
12

服務器返回未註冊我也跟着在http://developer.android.com/google/gcm/gs.html給出的演示,並得到了試用版應用程序,GCMTrial才能正常工作。Android GCM錯誤。當客戶端註冊

但是,我試圖遵循現有的應用程序相同的步驟,但因此未工作。所以我做了一個全新的項目。但即使如此,按照相同的步驟,我無法讓GCM成功發送消息。所以我嘗試將GCMTrial重命名爲所需的名稱,而不是那樣也行不通。

我通過主活動註冊GCM並獲得以下日誌:

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 

但是當我嘗試發送GCM消息時,它返回以下錯誤

[ errorCode=NotRegistered ] 

客戶端代碼:

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 
} 

}

清單:

服務器代碼:

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()); 

這讓我發瘋。它顯示了在Android手機上註冊,甚至調用GCMIntentService類的onRegistered方法..但是當我嘗試發送郵件,它標誌一個「NotRegistered錯誤」 ...... 我不知道我在做什麼錯..請幫我出球員....

+0

我不知道發生了什麼事。 但是,我重新安裝了Android的GCM附加程序,再次創建了一個全新的應用程序,這次它的工作原理! :) 我確實使用了 MulticastResult result = sender.send(message,devices,5); 而不是Result result = sender.send(message,clientID,1); 不知道,如果這是問題,但現在它的作品...! – user1657709

+0

我認爲你重新安裝後得到它的原因是因爲你已經聲明瞭一個新的註冊ID。 – neferpitou

回答

0

你忘了加上構造在GCMIntentService

以下內容添加到您的GCMIntentService

public GCMIntentService(){ 
     super(SENDER_ID); 
    } 

SENDER_ID是用來註冊應用程序的XXXXXXX。

+0

我試過了..服務器不停地發回一個「NotRegistered」錯誤.....任何其他的建議? – user1657709

+0

在我的情況下,我將Google提供給我的sender_ID添加到從服務器發送的請求中。但我使用ASP.Net發送請求。 –

+0

它不是SENDER_ID,它是THREAD的名稱,並且必須是SEND_ID,它可以是任何字符串。 – neferpitou

11

恩,知道了亞行安裝時,它的當前錯誤。

GCMRegistrar不知道該設備是GCM服務器上的未註冊,不註冊。

你可以做的是反正註冊:

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

或者UNINSTAL在客戶端的應用程序,然後運行一個新的亞行安裝。

請記住,有它發生在生產一些機會。

0

您可以嘗試將上下文「this」替換爲「getApplicationContext()」以使用應用程序上下文。這裏是我的示例代碼:

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; 
}