Android Cloud to Device Messaging Framework at GTUG Stockholm

29
Android Cloud to Device Messaging Framework

description

Presentation about C2DM at Stockholm Google Technology User Group at Know IT.

Transcript of Android Cloud to Device Messaging Framework at GTUG Stockholm

Page 1: Android Cloud to Device Messaging Framework at GTUG Stockholm

Android Cloud to Device

Messaging Framework

Page 2: Android Cloud to Device Messaging Framework at GTUG Stockholm
Page 3: Android Cloud to Device Messaging Framework at GTUG Stockholm

"It allows third-party application servers to send lightweight messages to their Android applications"Not designed to send a lot of content via messages. Instead use C2DM to tell the application that there is new data on the server to fetch.

Page 4: Android Cloud to Device Messaging Framework at GTUG Stockholm

"C2DM makes no guarantees about delivery or the order of messages"Eg. not suitable for instant messaging, instead use C2DM to notify the user that there is new messages.

Page 5: Android Cloud to Device Messaging Framework at GTUG Stockholm

"An application on an Android device doesn’t need to be running to receive messages"

Intent broadcast wake up the app

Page 6: Android Cloud to Device Messaging Framework at GTUG Stockholm

"It does not provide any built-in user interface or other handling for message data"Passes raw message data. You are free to do whatever you want with the data. Fire a notification, send SMS, start another application etc.

Page 7: Android Cloud to Device Messaging Framework at GTUG Stockholm

"It requires devices running Android 2.2 or higher that also have the Market application installed"

Market is needed for technical reasons. No need to distribute via Market.

Page 8: Android Cloud to Device Messaging Framework at GTUG Stockholm

"It uses an existing connection for Google services"Requires the user to be logged in with a Google Account on the device.

Page 9: Android Cloud to Device Messaging Framework at GTUG Stockholm

Establish connection with conn servers

App server sends HTTP POST Google

Stores message

Send to conn serversSend to

device

http://code.google.com/events/io/2010/sessions/push-applications-android.html

Page 10: Android Cloud to Device Messaging Framework at GTUG Stockholm

Lifecycle

Register deviceApp server send messageDevice receives messageUnregister device

Page 11: Android Cloud to Device Messaging Framework at GTUG Stockholm

Register device

App fires off Intent to register with Googlecom.google.android.c2dm.intent.REGISTER App receives Intent with registration ID from Googlecom.google.android.c2dm.intent.REGISTRATIONApp sends registration ID to app server

Page 12: Android Cloud to Device Messaging Framework at GTUG Stockholm

Register device// Intent to register Intent regIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); // Identifies the app regIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0)); // Identifies the role account, same as used when sendingregIntent.putExtra("sender", senderEmail); // Start registration process context.startService(regIntent);

Page 13: Android Cloud to Device Messaging Framework at GTUG Stockholm

Register device

public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("...REGISTRATION")) { handleRegistration(context, intent); }}

private void handleRegistration(Context context, Intent intent) { String registration = intent.getStringExtra("registration_id"); if (intent.getStringExtra("error") != null) { // Registration failed, should try again later. } else if (intent.getStringExtra("unregistered") != null) { // unregistration done } else if (registration != null) { // Send the registration ID to app server // This should be done in a separate thread. // When done, remember that all registration is done. }}

Page 14: Android Cloud to Device Messaging Framework at GTUG Stockholm

Unregister device

App fires off a unregister Intent to register with Google com.google.android.c2dm.intent.UNREGISTERApp tells app server to remove the stored registration ID

Page 15: Android Cloud to Device Messaging Framework at GTUG Stockholm

<manifest ... <application ... <service android:name=".C2DMReceiver" /> <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.markupartist.sthlmtraveling" /> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.markupartist.sthlmtraveling" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" /> <permission android:name="com.markupartist.sthlmtraveling.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.markupartist.sthlmtraveling.permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /></manifest>

Page 16: Android Cloud to Device Messaging Framework at GTUG Stockholm

<manifest ... <application ... <service android:name=".C2DMReceiver" /> <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name=" com.markupartist.sthlmtraveling " /> </intent-filter> <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name=" com.markupartist.sthlmtraveling " /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" /> <permission android:name=" com.markupartist.sthlmtraveling .permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name=" com.markupartist.sthlmtraveling .permission.C2D_MESSAGE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /></manifest>

Page 17: Android Cloud to Device Messaging Framework at GTUG Stockholm

Send message

For an application server to send a message, the following things must be in place:

The application has a registration ID that allows it to receive messages for a particular device.The third-party application server has stored the registration ID.

http://code.google.com/android/c2dm/index.html#lifecycle

There is one more thing that needs to be in place for the application server to send messages: a ClientLogin authorization token. This is something that the developer must have already set up on the application server for the application (for more discussion, see Role of the Third-Party Application Server). Now it will get used to send messages to the device.

From the documentation:

Page 18: Android Cloud to Device Messaging Framework at GTUG Stockholm

Send messageRetrieve ac2dm auth token (put on app server)Send authenticated POST - GoogleLogin auth=<TOKEN>- URL Encoded parameters

registration_idcollapse_keydeplay_while_idle - optionaldata.<KEY> - optional

Using cURL to interact with Google Data services:

http://code.google.com/apis/gdata/articles/using_cURL.html

Page 19: Android Cloud to Device Messaging Framework at GTUG Stockholm

curl https://www.google.com/accounts/ClientLogin \ -d Email=<ACCOUNT_EMAIL> -d Passwd=<PASSWORD> \ -d accountType=HOSTED_OR_GOOGLE \ -d source=markupartist-sthlmtraveling-1 \ -d service=ac2dm

ac2dm authorization token

SID=DQAAA...LSID=DQAAA...Auth=DQAAA...

Page 20: Android Cloud to Device Messaging Framework at GTUG Stockholm

Token can change

URL url = new URL(serverConfig.getC2DMUrl()); HttpURLConnection conn = (HttpURLConnection) url.openConnection();...// Check for updated token headerString updatedAuthToken = conn.getHeaderField("Update-Client-Auth");if (updatedAuthToken != null && !authToken.equals(updatedAuthToken)) { serverConfig.updateToken(updatedAuthToken);}

Page 21: Android Cloud to Device Messaging Framework at GTUG Stockholm

curl https://android.apis.google.com/c2dm/send \-d registration_id=<REGISTRATION ID> \-d collapse_key=foo \-d data.key1=bar \-d delay_while_idle=1 \-H "Authorization: GoogleLogin auth=<AUTH TOKEN>"

Send message

Response codes200 OK- id=<MESSAGE ID> of sent message, success- Error=<ERROR CODE>, failed to send401 Not Authorized503 Service Unavailable, retry

Page 22: Android Cloud to Device Messaging Framework at GTUG Stockholm

collapse_key

Only the latest message with the same key will be deliveredAvoids multiple messages of the same type to be delivered to an offline device State should be in app server and not in the messageEg. could be the URL to fetch data from

Page 23: Android Cloud to Device Messaging Framework at GTUG Stockholm

delay_while_idle

Message is not immediately sent to the device if it is idle

Page 24: Android Cloud to Device Messaging Framework at GTUG Stockholm

Receive a message

curl https://android.apis.google.com/c2dm/send \...-d data.key1=bar \...

protected void onReceive(Context context, Intent intent) { if (intent.getAction().equals("...RECEIVE")) { String key1 = intent.getExtras().getString("key1"); // If starting another intent here remember to set the // flag FLAG_ACTIVITY_NEW_TASK }}

Device receives the message and converts it to Intent - com.google.android.c2dm.intent.RECEIVEApp wakes up to handle Intent- data.<KEY> is translated to extras

Page 25: Android Cloud to Device Messaging Framework at GTUG Stockholm

Chrome to phone

http://code.google.com/p/chrometophone/source/browse/#svn/trunk/android/c2dm/com/google/android/c2dmC2DMessaging.register(context, "Role account email");

C2DMessaging.unregister(context);

Page 26: Android Cloud to Device Messaging Framework at GTUG Stockholm

public class C2DMReceiver extends C2DMBaseReceiver { public C2DMReceiver() { super("Role account email"); } @Override public void onRegistrered(Context context, String registration) { // Handle registrations } @Override public void onUnregistered(Context context) { // Handle unregistered } @Override public void onError(Context context, String errorId) { // Handle errors } @Override public void onMessage(Context context, Intent intent) { // Handle received message. }}

Page 27: Android Cloud to Device Messaging Framework at GTUG Stockholm

Problems

Can't send message to device if logged in with the role account

Page 28: Android Cloud to Device Messaging Framework at GTUG Stockholm

References

http://code.google.com/android/c2dm/ http://code.google.com/events/io/2010/sessions/push-applications-android.htmlhttp://code.google.com/p/chrometophone/

Page 29: Android Cloud to Device Messaging Framework at GTUG Stockholm

Demo

http://screenr.com/QDn

http://screenr.com/ovn