我正在尝试向 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 的回复。