设备不接收有效负载消息,但接收注册消息

时间:2012-01-18 21:42:38

标签: android android-c2dm

目前使用c2dm构建一个Android应用程序,推送来自构建在app引擎上的网站的消息。我已经遵循了许多教程,到目前为止......

  • 我已经使用c2dm创建了一个帐户并获得了批准
  • 让我的设备注册C2DM服务器(接收注册ID)
  • 将此注册ID与设备的链接电子邮件一起推送到我的应用程序,该应用程序正在存储它。
  • 向Google的ClientLogin发送请求,并返回有效的Auth令牌。
  • 使用payload,regId和auth令牌将发布请求发送到C2DM服务器。我也从c2dm服务器收到了一个“Ok”状态代码(200)。所以我假设它顺利通过。

但是,我的设备只是坐在那里,没有收到任何消息。我花了最后一周将项目拆开并从头开始重建多次,并且它总是回到设备而根本没有收到有效负载消息。我不知道我哪里出错了。

我的帐户可能有问题吗?无论如何,我是否要检查C2DM服务器上的待处理消息?

代码: Android Manifest

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

在Android上接收C2DM消息

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.");
        }
    }

2 个答案:

答案 0 :(得分:0)

请确保您用于获取手机上的注册ID的电子邮件ID以及用于获取身份验证令牌的电子邮件ID是相同

还要确保您的有效负载不会超过1024个字符。有效负载有1024个字符限制。

您还必须确保在批准时使用email-id注册的包名称是相同的。我假设你已经这样做了。

答案 1 :(得分:0)

  1. 首先,您必须从C2DM收到您的设备的注册ID

  2. 在您的应用服务器中使用此设备register-id并获取身份验证令牌

  3. 使用此身份验证和设备注册ID发送有效负载

  4. 但是,由于您没有按顺序执行此操作,因此您的设备注册ID将再次更改,但您使用的是旧ID。因此,您无法在设备中收到消息 正如你这样执行。

    按照第4章中提供的示例应用程序执行:
    http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html