3

我正在尝试向 C2DM 注册我的设备,但遇到了重大问题。我遵循了几个教程,所有这些教程都非常相似。我相信这个问题与它发送到 C2DM 服务器的注册意图有关。有没有人有什么建议。以下是相关代码:

清单:权限(在我的应用程序标签之外):

<!-- Used for C2DM -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.companyname.parade.permission.C2D_MESSAGE" />

这是 Intent 注册(在我的应用程序标签内):

<receiver
    android:name=".C2DMReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <!-- Receive the actual message -->
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />

        <category android:name="com.companyname.parade" />
    </intent-filter>
    <!-- Receive the registration id -->
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.companyname.parade" />
    </intent-filter>
</receiver>

以下是我将我的设备注册到 C2DM 服务器的调用(它启动了联系 C2DM 服务器的服务,该服务假设发送回带有我的 registartionID 的注册 Intent)。它位于一个名为C2DMessaging的文件中:

public static void register(Context context) {
    Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT);
    registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT,
            PendingIntent.getBroadcast(context, 0, new Intent(), 0));
    registrationIntent.putExtra(EXTRA_SENDER, SENDER_ID);
    ComponentName name = context.startService(registrationIntent);
    if(name == null){
        // FAIL!
        Log.d(TAG, "FAIL");
    }else{
        // SUCCESS
        Log.d(TAG, "Success");
    }
}

ComponentName 信息如下:

com.google.android.gsf/com.google.android.gsf.gtalkservice.PushMessagingRegistrar

没有 logcat 输出。我的接收器(名为C2DMReceiver)如下:

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (C2DMessaging.INTENT_REGISTRATION_CALLBACK.equals(action)) {
        // Registration Intent
        Log.w(TAG, "Registration Receiver called");
        handleRegistration(context, intent);
    } else if (action.equals(C2DMessaging.INTENT_RECEIVED_MESSAGE_CALLBACK)) {
        Log.w(TAG, "Message Receiver called");
        handleMessage(context, intent);
    } else if (action.equals(C2DMessaging.INTENT_C2DM_RETRY)) {
        C2DMessaging.register(context);
    }
}

这根本不会被调用。

编辑:这整件事对我来说是一个愚蠢的错误。我只是在阅读的教程中忘记了一个步骤。我需要将此添加到我的权限中:

<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />

感谢 MisterSquonk 的回复。

4

2 回答 2

2

在 Google docs for C2DM for Creating the Manifest中,清单需要一个条目<permission>来补充.<uses-permission>C2D_MESSAGE

像这样的东西...

<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />
于 2012-04-17T18:54:27.287 回答
0

本教程帮助我加快速度: http ://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

我不确定你为什么有两个意图过滤器。我只需要一个 - com.google.android.c2dm.intent.REGISTRATION(有关完整示例清单,请参见上面的教程)

我会检查您的清单是否正确引用了接收器类 - 也许尝试对该类的完全限定引用。有一次我遇到了一个问题,我在项目结构中移动了接收器类并且所有消息都停止了。

我还要检查 C2DM 帐户是否设置正确,并使用正确的包名称。

我也会在另一台设备上尝试它,因为根据我的经验,一些 Android 设备会脱离 C2DM 并且在一段时间内不会收到消息。我发现有时切换到飞行模式并返回可以解决问题,但我发现在几种设备上进行测试对于排除特定设备的问题至关重要。

于 2012-04-17T16:10:52.390 回答