views:

579

answers:

3

Hi there, 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" 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","[email protected]");
Log.d("WelcomeScreen","[email protected]");
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

A: 

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");
Josef
I'm sorry, I must have made a mistake while copying the text here, because I just checked my manifest and It DOES have a line like the one you say is missing. And for the second part of your answer I must say that I'm not even trying to send a message yet. I'm just trying to register the application and that is done by means of Intents for what I understood.
Bilthon
I don't really know what it means, but I just noticed that I get this line at logcat: 09-06 20:08:04.063: ERROR/C2DMRegistrar(169): [C2DMReg] handleRequest caught java.io.IOException: SSL shutdown failed: I/O error during system call, Broken pipe
Bilthon
Hm. Interesting. I added another thing you can try to my post.
Josef
Nope.. nothing happens. I get this error now : 09-08 22:06:47.188: ERROR/C2DMRegistrar(177): [C2DMReg] handleRequest caught java.net.UnknownHostException: android.clients.google.com
Bilthon
Ah. Then it looks like a DNS or network problem. Can you resolve other hosts (e.g. google.com) on that device?
Josef
+1  A: 

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

Bilthon
+1  A: 

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.

yayitswei