How to Implement a Gcm Hello World for Android Using Android Studio

How to implement a GCM Hello World for Android using Android Studio

If you have read the two links in your question and understood GCM key concepts, then you can refer to the following sample codes:

Of course, let's assume that you have finished:

  • Create a project and its server API key at Google Developers Console
  • Set permissions in your AndroidManifest files like this <uses-permission android:name="android.permission.INTERNET" />

Server side:

public class MainActivity extends AppCompatActivity {

private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTextView = (TextView) findViewById(R.id.textView);

new GCMRequest().execute();
}

...

private class GCMRequest extends AsyncTask<Void, Void, String> {

@Override
protected String doInBackground(Void... voids) {

final String API_KEY = "..."; // An API key saved on the app server that gives the app server authorized access to Google services
final String CLIENT_REG_ID = "..."; //An ID issued by the GCM connection servers to the client app that allows it to receive messages
final String postData = "{ \"registration_ids\": [ \"" + CLIENT_REG_ID + "\" ], " +
"\"delay_while_idle\": true, " +
"\"data\": {\"tickerText\":\"My Ticket\", " +
"\"contentTitle\":\"My Title\", " +
"\"message\": \"Test GCM message from GCMServer-Android\"}}";

try {
URL url = new URL("https://android.googleapis.com/gcm/send");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Authorization", "key=" + API_KEY);

OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
writer.write(postData);
writer.flush();
writer.close();
outputStream.close();

int responseCode = urlConnection.getResponseCode();
InputStream inputStream;
if (responseCode < HttpURLConnection.HTTP_BAD_REQUEST) {
inputStream = urlConnection.getInputStream();
} else {
inputStream = urlConnection.getErrorStream();
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String temp, response = "";
while ((temp = bufferedReader.readLine()) != null) {
response += temp;
}
return response;
} catch (IOException e) {
e.printStackTrace();
return e.toString();
}
}

@Override
protected void onPostExecute(String message) {
super.onPostExecute(message);

if (mTextView != null) {
try {
JSONObject jsonObject = new JSONObject(message);
mTextView.setText(jsonObject.toString(5));
} catch (JSONException e) {
e.printStackTrace();
mTextView.setText(e.toString());
}
}
}
}
}

Client-side:

MainActivity.java:

public class MainActivity extends AppCompatActivity {

private final Context mContext = this;
private final String SENDER_ID = "..."; // Project Number at https://console.developers.google.com/project/...
private final String SHARD_PREF = "com.example.gcmclient_preferences";
private final String GCM_TOKEN = "gcmtoken";
public static TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE);
String token = appPrefs.getString(GCM_TOKEN, "");
if (token.isEmpty()) {
try {
getGCMToken();
} catch (Exception e) {
e.printStackTrace();
}
}

mTextView = (TextView) findViewById(R.id.textView);
}

...

private void getGCMToken() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
InstanceID instanceID = InstanceID.getInstance(mContext);
String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
if (token != null && !token.isEmpty()) {
SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString(GCM_TOKEN, token);
prefsEditor.apply();
}
Log.i("GCM", token);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
}

GcmService.java:

public class GcmService extends GcmListenerService {

@Override
public void onMessageReceived(String from, Bundle data) {
JSONObject jsonObject = new JSONObject();
Set<String> keys = data.keySet();
for (String key : keys) {
try {
jsonObject.put(key, data.get(key));
} catch (JSONException e) {
e.printStackTrace();
}
}
try {
sendNotification("Received: " + jsonObject.toString(5));
} catch (JSONException e) {
e.printStackTrace();
}
}

@Override
public void onDeletedMessages() {
sendNotification("Deleted messages on server");
}

@Override
public void onMessageSent(String msgId) {
sendNotification("Upstream message sent. Id=" + msgId);
}

@Override
public void onSendError(String msgId, String error) {
sendNotification("Upstream message send error. Id=" + msgId + ", error" + error);
}

private void sendNotification(final String msg) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
if (MainActivity.mTextView != null) {
MainActivity.mTextView.setText(msg);
}
}
});
}
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gcmandroid" >

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

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

<application
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.gcm" />
</intent-filter>
</receiver>
<service android:name=".GcmService" android:exported="false">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>

<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Adding Google Cloud Messagin (GCM) for Android - Registration process

Is my answer with source code at your question How to implement a GCM Hello World for Android using Android Studio is not enough for you to create two simple GCM projects (server-side and client-side) yet? :)

Of course, the sample code I used is just for a very basic case "server app sends, client app receives and displays message".

To sum up, you need to do the following steps:

  1. Create a new project at Google Developers Console . At this
    step, for simplicity, you just need to take note of 2 values: Project Number, which
    will be used as SENDER_ID in my client project; and API server key (created at Credentials), which
    will be used as API_KEY in my server project.
  2. Create a new simple Android project for server side (with basic source code as my answer in your previous question).
  3. Create a new simple Android project for client side (with basic source code as my answer in your previous question, I customized from the original source at Google Cloud Messaging - GitHub).
  4. Run the client app, you will get the registration token (means that your device has successfully registered). Then, paste (hard-code) this token at CLIENT_REGISTRATION_TOKEN variable in server app.
  5. Run the server app, and check the result (client app received the message or not)

Hope this helps!

P/S: I don't use any appengine-web.xml file

How to implementing server for Google Cloud Messaging to send Push notification android studio

Let's assume you have created a new project at Google Developers Console and taken note of 2 values: Project Number, which will be used as SENDER_ID in a client project; and API server key (created at Credentials), which will be used as API_KEY in a server project.

You can find more about basic server project with my answers at the following questions. In the second link, you will find sample code for a server project in Java:

Adding Google Cloud Messagin (GCM) for Android - Registration process

How to implement a GCM Hello World for Android using Android Studio

Hope this helps!

Sending push notification using Google GCM

Let's assume you have created a new project at Google Developers Console and taken note of 2 values: Project Number, which will be used as SENDER_ID in a client project; and API server key (created at Credentials), which will be used as API_KEY in a server project.

You can find more about basic server project with my answers at the following questions. In the second link, you will find sample code for a server project in Java, then you can refer to its logic to implement in your PHP project:

Adding Google Cloud Messagin (GCM) for Android - Registration process

How to implement a GCM Hello World for Android using Android Studio

Hope this helps!

GCM how to implement the server side for upstream using Jaxl

So after spending a very very long time to find out what is the correct implementation of the server side in GCM I found this question (almost the same as mine) server side in GCM
meaning that I CAN implement GCM ( downstream and upstream ) in my localhost Google App engine is not necessary.

The server can be implemented using php (e.g with Jaxl library) or Java (e.g Smack library)

I used this sample code provided by Google Server-Client-GCM

  1. on my android I ran the Android code of the sample

  2. then I imported the server's code in an another Android studio window , supplying my api key and sender key just as instructed by the sample code in GitHub

  3. On my Android phone I just built the project and removed any piece of code that gradle could not find

  4. On my Server I entered the Build code in the Android Studio terminal ,after it was finished I entered the Run code (the codes can found in the server instructions in the Google samples, depending if you want to use a Java server or a Go server)

  5. My server is now running and it it waiting for a client.

  6. I ran the build on my Android phone then I sent a ping (the ping included registration token that was given by GCM when I ran the application on my phone)

  7. Looking back at My server I can see it received a msg from my Android phone (by looking at the registration token that was sent to the server)

The GCM server side was not an obvious implementation to me, I hope my post will help someone.



Related Topics



Leave a reply



Submit