我正在尝试使用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服务器联系的服务,该服务假设将寄存器Intent与我的registartionID一起发回)。它位于名为 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的回复。
答案 0 :(得分:2)
在Creating the Manifest的C2DM文档中,清单需要<permission>
条目来补充<uses-permission>
的{{1}}条目。
像这样......
C2D_MESSAGE
答案 1 :(得分:0)
本教程让我了解速度: http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html
我不确定为什么你有两个意图过滤器。我只需要一个 - com.google.android.c2dm.intent.REGISTRATION(请参阅上面的教程以获取完整的示例清单)
我会检查你的清单是否正确引用了接收器类 - 或者尝试对该类进行完全限定的引用。我有一个问题,我在项目结构中移动了接收器类,所有消息都停止了。
我还会检查C2DM帐户是否设置正确,并使用正确的包名称。
我也会在另一台设备上试用它,因为根据我的经验,一些Android设备会脱离C2DM并且在一段时间内不会收到消息。我发现有时会轻弹到飞行模式然后将其排序,但我发现在几个设备上进行测试对于排除特定设备的问题至关重要。