开发者

Problem registering for C2DM in Android

开发者 https://www.devze.com 2023-01-15 09:15 出处:网络
I\'m trying to test the C2DM framework. I got the confirmation email a couple of days ago and then tryied to create a client that could register. For that purpose, I createda simple client following t

I'm trying to test the C2DM framework. I got the confirmation email a couple of days ago and then tryied to create a client that could register. For that purpose, I created a simple client following the steps described in this tutorial: http://code.google.com/intl/es-419/android/c2dm/index.html.

The Android manifest file contains among other things this code:

<permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" />

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<uses-permission android:name="android.permission.INTERNET"/>

<receiver android:name=".C2DMReceiver开发者_Go百科" android:permission="com.google.android.c2dm.permission.SEND">

<intent-filter>
   <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
   <category android:name="com.bilthon.ufrj" />
</intent-filter>

<intent-filter>
   <action android:name="com.google.android.c2dm.intent.RECEIVE" />
   <category android:name="com.bilthon.ufrj" />
</intent-filter>
</receiver>

And then, the main activity launched when the program starts has the following code:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender","mytestemail@gmail.com");
Log.d("WelcomeScreen","mytestemail@gmail.com");
startService(registrationIntent);

I also registered a google account on the AVD running my client, as they said it was required. But the problem is that I cannot get the broadcast receiver to "wake up". I don't know what could be wrong. By analysing the logs, I can see that the registration intent is created and apparently used correctly, but the receiver code just never is executed, what could be wrong?

Thanks in advance Nelson


Well.. just sorted it out, the problem was with the declaration of the receiver. The tags for the receiver should go inside the application tag, just as demonstrated here: http://developer.android.com/guide/topics/manifest/manifest-intro.html

Here's an example of a well formated Manifest for a C2DM application. Thanks to Mark Murphy for posting the link at the android-c2dm group.

And sorry for the silly mistake.

Nelson


I just got this working myself after wrestling with it for some time.

In the manifest, you have the line

<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">

Which means you need a class called C2DMReceiver that extends C2DMBaseReceiver in the c2dm package. To get implement this, I copied both the c2dm package and C2DMReceiver.java file from the chrometophone-android example over to my project and was able to get a registration id from the C2DM server as intended.


I had the same problem. My solution was moving all of the permissions in my manifest above the application tag.


Things you can check:

1 I noticed is that you are declaring a C2DM permission but don't use it in your application like so:

<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" />

2 If you have a look at the c2dm library you will see that the helper C2DMessaging's register method creates the intent with an additional call to setPackage.

registrationIntent.setPackage("com.google.android.gsf");
0

精彩评论

暂无评论...
验证码 换一张
取 消