Hello Droid Guys,
This tutorial helps you to implement “Google Cloud Messaging for Android (GCM)" and
sending "Android Push Notification" using GCM.
According to Google, “Google Cloud Messaging for Android (GCM)" is a service which
helps developer in sending data from server to there "Android Application" whenever
there is new data added on server. Also , No need to request server after every time
period(the timely fashion which we mostly did to fetch updated data from server after a
fixed time period for e,g after every 6hrs,or a day).
1. How it works ?
1. Android device sends a "sender id" and "application id" to GCM server for
registration.
2. After Successfully registration on server, the GCM server generate a
"Registration id" and returns it.
3. After receiving this "registration id" the device send this "registration id "
to our server (i.e. my mysql server).
4. Our server store this "registration id" into database for later usage.
Registering Your Application for “Google Cloud Messaging for Android (GCM)":
Step-1. Goto Here and create a new project. (If you haven’t created already
otherwise it will take you to dashboard).
Step-2. Click on create project and check your browser url, It will change some thing
like:
" https://code.google.com/apis/console/#project:4815162342 "
Note: This Id will be used by the Android Device while Registering for Push Notification.
Step-3. Choose Service tab from the left side menu on the web page. and turn on
“ Google Cloud Messaging for Android “
Server key and note down the generated key.
Creating Andrid application for GCM:
Note: Before starting to create android application , first update your ADT plugin to 20.
1. Go to window => android Sdk => extras=> choose Google Cloud Messaging for Android Library.
Now Start Creating Android application project and remember to add gcm .jar inside your project lib folder.
You can easily find this gcm.jar inside your android_sdk/extras/google/gcm after updating your ADT and
SDk.
Now place following file inside your project
1.PushAndroidActivity.java
package com.mukesh.gcm;
import static com.mukesh.gcm.CommonUtilities.SENDER_ID;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.android.gcm.GCMRegistrar;
public class PushAndroidActivity extends Activity {
private String TAG = "** pushAndroidActivity **";
private TextView mDisplay;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
checkNotNull(SENDER_ID, "SENDER_ID");
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
setContentView(R.layout.main);
mDisplay = (TextView) findViewById(R.id.display);
final String regId = GCMRegistrar.getRegistrationId(this);
Log.i(TAG, "registration id ===== " + regId);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
mDisplay.setText("ffffff " + regId);
}
private void checkNotNull(Object reference, String name) {
if (reference == null) {
throw new NullPointerException(getString(R.string.error_config,
name));
}
}
@Override
protected void onPause() {
super.onPause();
GCMRegistrar.unregister(this);
}
}
2.GCMIntentService.java
package com.mukesh.gcm;
import static com.mukesh.gcm.CommonUtilities.SENDER_ID;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;
public class GCMIntentService extends GCMBaseIntentService {
public GCMIntentService() {
super(SENDER_ID);
}
private static final String TAG = "===GCMIntentService===";
@Override
protected void onRegistered(Context arg0, String registrationId) {
Log.i(TAG, "Device registered: regId = " + registrationId);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Log.i(TAG, "unregistered = " + arg1);
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.i(TAG, "new message= ");
}
@Override
protected void onError(Context arg0, String errorId) {
Log.i(TAG, "Received error: " + errorId);
}
@Override
protected boolean onRecoverableError(Context context, String errorId) {
return super.onRecoverableError(context, errorId);
}
}
3. CommonUtilities.java
package com.mukesh.gcm;
public final class CommonUtilities {
static final String SENDER_ID = "4815162342";
}
4. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mukesh.gcm" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />
<permission android:name="com.mukesh.gcma.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.mukesh.gcm.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity android:name=".PushAndroidActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.mukesh.gcm" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
</application>
</manifest>
Enjoy Coding... :)
Cheers :)
Also see this blog for more help:
1. Open| Launch Activity on receiving Push Notification
Thanks Smith
ReplyDeleteWhere GCM is used.. What is the purpose.. ple giv reply
ReplyDeleteWe can use GCM for serveral purpose like:
ReplyDelete1.sending notification on android device
2. Also if you are going to imaplement some chat application , gcm will be usefull.
3. Notifying the user about the updates related to app and many more....
i am getting error in error_config in PushAndroidActivity.java page.. What i want to do for that Mukesh
ReplyDeletewill you please share me the logcat error...show taht I will help you...
ReplyDelete05-08 11:31:07.592: D/AndroidRuntime(340): Shutting down VM
ReplyDelete05-08 11:31:07.592: W/dalvikvm(340): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-08 11:31:07.612: E/AndroidRuntime(340): FATAL EXCEPTION: main
05-08 11:31:07.612: E/AndroidRuntime(340): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sagar.gcma/com.sagar.gcma.MainActivity}: java.lang.UnsupportedOperationException: Device does not have package com.google.android.gsf
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.os.Looper.loop(Looper.java:123)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-08 11:31:07.612: E/AndroidRuntime(340): at java.lang.reflect.Method.invokeNative(Native Method)
05-08 11:31:07.612: E/AndroidRuntime(340): at java.lang.reflect.Method.invoke(Method.java:507)
05-08 11:31:07.612: E/AndroidRuntime(340): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-08 11:31:07.612: E/AndroidRuntime(340): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-08 11:31:07.612: E/AndroidRuntime(340): at dalvik.system.NativeStart.main(Native Method)
05-08 11:31:07.612: E/AndroidRuntime(340): Caused by: java.lang.UnsupportedOperationException: Device does not have package com.google.android.gsf
05-08 11:31:07.612: E/AndroidRuntime(340): at com.google.android.gcm.GCMRegistrar.checkDevice(GCMRegistrar.java:98)
05-08 11:31:07.612: E/AndroidRuntime(340): at com.sagar.gcma.MainActivity.onCreate(MainActivity.java:27)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-08 11:31:07.612: E/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
05-08 11:31:07.612: E/AndroidRuntime(340): ... 11 more
Force close is comming. And i import gcm.jar file also.
ReplyDeletei just change error_config in PushAndroidActivity.java
page to app_name..
This is an package issue cross check your activity package name declaration in manifest file.This package is not found in your app "com.google.android.gsf" please check your code.
ReplyDeleteThankq..
ReplyDeleteThanks for this example. This is perfect working. but i have one question is it possible to display Badge count into Application Icon into Home Screen?
ReplyDeletevery helpful tutorial thanks alot....:)
ReplyDeleteHey...
ReplyDeletei want to communicate through gcm....
between two devices...
so that one user can send message to another user...only..
if possible plse give me some sample code..