2012-01-18 97 views
0

目前正在構建一個使用c2dm的Android應用,從構建於應用引擎上的網站推送消息。我按照許多教程到目前爲止...設備未收到有效負載消息,但正在接收註冊消息

  • 我與C2DM一個帳戶,並得到它認可
  • 有我的設備與C2DM服務器註冊(receiveing註冊ID)
  • 推此註冊ID連同設備的鏈接電子郵件到我的應用程序正在存儲它。
  • 向Google的ClientLogin發送請求,並獲取有效的Auth令牌。
  • 使用有效負載,regId和auth令牌向C2DM服務器發送發佈請求。我還收到了來自c2dm服務器的「Ok」狀態代碼(200)。所以我假設它完成了。

但是,我的設備就在那裏,沒有收到任何消息。上個星期我花了很多時間拆分項目並重建它,並且它總是回到設備上,而沒有收到有效負載消息。我不知道我要出錯的地方。

請問我的帳戶有問題嗎?無論如何,我可以檢查C2DM服務器上的掛起消息嗎?代碼

位: Android清單

<permission android:name="skaught.wingman.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="skaught.wingman.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <receiver android:name="C2DReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
     <!-- Receive registration ids --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
      <category android:name="skaught.wingman" /> 
     </intent-filter> 

     <!-- Receive actual messages --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="skaught.wingman" /> 
     </intent-filter> 
    </receiver> 
    .... 

發送推C2DM服務器

payload = { 
    "data.payload" : "Please Work!", 
    "registration_id": regId, 
    "collapse_key": hash(email), 
} 
encodedPayload = urllib.urlencode(payload) 
url = "http://android.clients.google.com/c2dm/send" 

#Make a POST request to C2DM server 
result = urlfetch.fetch(url=url, 
         payload=encodedPayload, 
         method=urlfetch.POST, 
         headers={ 'Content-Type': 'application/x-www-form-urlencoded', 
            'Authorization': 'GoogleLogin auth=' + authToken} 
         ) 

接收C2DM消息在Android

public class C2DReceiver extends BroadcastReceiver { 
    @Override 
    public final void onReceive(Context context, Intent intent) { 
     Log.d(Constants.TAG, "Received a Message");   
     if (Constants.RECEIVED_REGISTRATION_ID_FROM_GOOGLE.equals(intent.getAction())) {    
      Log.d(Constants.TAG, "Received a registration ID from Google."); 
      handleRegistration(context, intent); 
     } else if (Constants.RECEIVED_C2DM_MESSAGE_FROM_GOOGLE.equals(intent.getAction())) {    
      //I'm NEVER reached! 
      Log.d(Constants.TAG, "Received a C2DM message from Google."); 
     } 
    } 

回答

0

請確認的電子郵件 - 你用來獲取登錄號碼e和用於獲取授權令牌的電子郵件ID是相同

還要確保您的有效負載不會超過1024個字符。有效載荷有1024個字符限制。

您還必須確保您在批准時用email-id註冊的包名稱相同。我假設你已經這樣做了。

0
  1. 首先,你必須從C2DM收到登記-ID到您的設備

  2. 使用該設備寄存器-ID在你的應用服務器,並獲得認證令牌

  3. 使用此認證與設備註冊─ id發送有效載荷

但是,由於您沒有按照順序進行操作,所以您的設備註冊ID越來越多再次更改,但您使用的是舊ID。因此,當您像這樣執行時,您無法在設備 中收到消息。

按照第4章這裏提供的示例應用程序:
http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html