Android Firebase Push Notification To Multiple Devices From Server(PHP-MySQL)

android firebase push notification

Hi Android geeks. Android firebase push notification tutorial for multiple devices is here.

In this Android firebase push notification tutorial, we will send push notification to single or multiple devices from server(PHP-MySQL.)

This Android firebase push notification is developed using Android Studio and JAVA.

If you don’t want to send notification from server, then check Firebase cloud messaging Android.

First, check the output of Android firebase push notification example then we will develop it.

Download Source Code for Android firebase push notification

[sociallocker] Download FCMMultiple [/sociallocker]

Step 1: Create a new project in Android Studio.

A new Android Studio project with empty activity is required for this project. So create it first.

Step 2: Working with Firebase Console

Following video will guide you to develop app in firebase console.

Learning Easy steps of firebase console video

  1. Go to https://firebase.google.com/ and sign in to your google account.
  2. Click on Add Project and give project name and country.
  3. Click on CREATE PROJECT button.
  4. After project is created, click on Add firebase to your Android app button.
  5. Give your Android package name and click on Register App button.
  6. Click on Download google-services.json button.
  7. Move your downloaded JSON file into app folder of your android project as shown in the video.

Step 1: Create a new project in Android Studio.

Step 3: Changing build.gradle(Project: project_name) file:

Add following in dependencies{} structure

classpath 'com.google.gms:google-services:3.1.0'

So last source code for build.gradle(Project: project_name)  is:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:3.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Step 4: Changing build.gradle(Module:app) file

Copy below into dependencies{}

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.exampledemo.parsaniahardik.fcmsingle"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'

    compile 'com.google.firebase:firebase-messaging:9.0.2'
}
apply plugin: 'com.google.gms.google-services'

Step 5: Developing Service Classes

Developing GettingDeviceTokenService

Make a new JAVA class named GettingDeviceTokenService”  and copy following

import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

/**
 * Created by Parsania Hardik on 09-Jun-17.
 */
public class GettingDeviceTokenService extends FirebaseInstanceIdService {

    @Override
    public void onTokenRefresh() {
        String DeviceToken = FirebaseInstanceId.getInstance().getToken();
        Log.d("DeviceToken ==> ",  DeviceToken);
    }
}

Device token is found in this service.

Developing NotificationService

Create a new JAVA class named NotificationService” and add below source code

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.text.Html;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by Parsania Hardik on 09-Jun-17.
 */
public class NotificationService extends FirebaseMessagingService {

    public static  int NOTIFICATION_ID = 1;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        //Call method to generate notification
        if (remoteMessage.getData().size() > 0) {
            Log.e("dataa", "Data Payload: " + remoteMessage.getData().toString());
            try {
                JSONObject jsonObject = new JSONObject(remoteMessage.getData().toString());
                JSONObject dataObject = jsonObject.getJSONObject("data");
                String imageURL = dataObject.getString("image");
                String title = dataObject.getString("title");
                String message = dataObject.getString("message");

                if(imageURL.equals("no")){
                    generateNotification( message);
                }else {
                    Bitmap bitmap = getBitmapFromURL(imageURL);
                    notificationWithImage(bitmap, title, message);
                }
            } catch (Exception e) {
                Log.e("exc", "Exception: " + e.getMessage());
            }
        }

    }

    private void generateNotification( String message) {
        Intent intent = new Intent(this, GotNotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Cloud or Push Notification")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (NOTIFICATION_ID > 1073741824) {
            NOTIFICATION_ID = 0;
        }
        notificationManager.notify(NOTIFICATION_ID++ , mNotifyBuilder.build());
    }

    private void notificationWithImage(Bitmap bitmap, String title, String message) {

        Intent intent = new Intent(this, GotNotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
        bigPictureStyle.setBigContentTitle(title);
        bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
        bigPictureStyle.bigPicture(bitmap);
        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this)
                 .setAutoCancel(true)
                .setContentTitle(title)
                .setContentIntent(pendingIntent)
                .setSound(defaultSoundUri)
                .setStyle(bigPictureStyle)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher))
                .setContentText(message);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (NOTIFICATION_ID > 1073741824) {
            NOTIFICATION_ID = 0;
        }
        notificationManager.notify(NOTIFICATION_ID++ , mNotifyBuilder.build());
    }

    public Bitmap getBitmapFromURL(String strURL) {
        try {
            URL url = new URL(strURL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

Description of NotificationService

remoteMessage.getData().toString() will give us JSON data as following

{
  data:
      {
        "image":"http:\/\/demonuts.com\/Demonuts\/JsonTest\/Tennis\/uploadedFiles\/popey.jpg",
        "title":"weeee",
        "message":"asss"
      }
}

Following source code will parse above JSON data

JSONObject jsonObject = new JSONObject(remoteMessage.getData().toString());
                JSONObject dataObject = jsonObject.getJSONObject("data");
                String imageURL = dataObject.getString("image");
                String title = dataObject.getString("title");
                String message = dataObject.getString("message");

Now following source will decide whether user has sent image with notification or not.

if(imageURL.equals("no")){
                    generateNotification( message);
                }else {
                    Bitmap bitmap = getBitmapFromURL(imageURL);
                    notificationWithImage(bitmap, title, message);
}

If image is not sent, then generateNotification() will be run.

Otherwise notificationWithImage() will be run.

getBitmapFromURL() method will give us bitmap of image(Popey Image.)

Now consider below source code

Intent intent = new Intent(this, GotNotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

Above code will decide which activity to open when user clicks on Push Notification.

Here GotNotificationActivity will be open. So let’s create GotNotificationActivity.

Create a new activity named GotNotificationActivity and update activity_got_notification.xml as follow:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.exampledemo.parsaniahardik.fcmsingle.GotNotificationActivity">
 
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:textColor="#000"
        android:textSize="20sp"
        android:text="I opened when you clicked on Notification! "/>
 
</RelativeLayout>

Developing Server Side(PHP) script to send firebase push notification

Create a new PHP file and name it sendMultipleFCM.php

Add below source code into it

<?php

   if($_SERVER['REQUEST_METHOD']=='POST'){
  // echo $_SERVER["DOCUMENT_ROOT"];  // /home1/demonuts/public_html
  //including the database connection file
       //include_once("config.php");
      

                  $serverAPIKey = $_POST['serverapi'];
                   define('FIREBASE_SERVER_KEY', $serverAPIKey);
                                  
                 // echo FIREBASE_SERVER_KEY;exit;
                   $selection  = $_POST['isImage'];
                 //  echo $title.$selection;exit;
	         //first check if the push has an image with it
		 if( $_POST["isImage"] == "Yes" ){
			 
			  $serverAPIKey = $_POST['serverapi'];
			  $reg_token= $_POST['token'];
			  $reg_token2= $_POST['token2'];
			  $title= $_POST['title'];
	 	          $message= $_POST['message'];
	 	          $image= "http://demonuts.com/Demonuts/JsonTest/Tennis/uploadedFiles/popey.jpg";
	 	          
			 
		 }else{
		      //if the push don't have an image give null in place of image
		        $serverAPIKey = $_POST['serverapi'];
			$reg_token= $_POST['token'];
			$reg_token2= $_POST['token2'];
		        $title= $_POST['title'];
	 	        $message= $_POST['message'];
	 	        $image= "no";
	 	       
		 }
		 
		         
	        //firebase server url to send the curl request
	        $url = 'https://fcm.googleapis.com/fcm/send';
	 
	        //building headers for the request
	        $headers = array(
	            'Authorization: key='. FIREBASE_SERVER_KEY,
	            'Content-Type: application/json'
	        );
	
	        //Initializing curl to open a connection
	        $ch = curl_init();
	 
	        //Setting the curl url
	        curl_setopt($ch, CURLOPT_URL, $url);
	        
	        //setting the method as post
	        curl_setopt($ch, CURLOPT_POST, true);
	
	        //adding headers 
	        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	 
	        //disabling ssl support
	        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	        
	        $gcmRegIds = array($reg_token,$reg_token2);
	       // $gcmRegIds = array($reg_token);
	       // print_r($gcmRegIds);exit;
	       // $messagearray = array("message" => $message , "title" => $title , "image" => $image);
	        $messagearray = array();
	        $messagearray['data']['title'] = $title;
	        $messagearray['data']['message'] = $message;
	        $messagearray['data']['image'] = $image;
	        //adding the fields in json format 
	         $fields = array(
	             'registration_ids' => $gcmRegIds,
	             'data' => $messagearray,
	        );
	        
	        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
	 
	        //finally executing the curl request 
	        $result = curl_exec($ch);
	        if ($result === FALSE) { 
	           die('Curl failed: ' . curl_error($ch));
	        }
	  
	         header("Location: http://www.demonuts.com/Demonuts/JsonTest/Tennis/sendMultipleFCM.php");
               //  exit();
	        //Now close the connection
	        curl_close($ch);
	 
	        //and return the result 
	        return $result;
	        
    	
   } else{
			//echo json_encode(array( "status" => "false","message" => "Error occured, please try again!") );
}
?>

<html>
    <head>
        <title>DemoNuts Firebase Cloud Messaging (FCM) Server in PHP</title>
        <style type="text/css">
       
		        #submit {
			    background-color: #4CAF50;
			    border: none;
			    color: white;
			    padding: 15px 32px;
			    text-align: center;
			    text-decoration: none;
			    display: inline-block;
			    font-size: 16px;
			    margin: 4px 2px;
			    cursor: pointer;
		         }
		         #navigation
			{
			    position: absolute; /*or fixed*/
			    right: 0px;
			      margin-right: 270px;
			}
			.large
			{
			    font-size: 14pt;
			    height: 40px;
			}
        </style>
    </head>
	<body>
			<div id="navigation" style=" height: 600px ; width : 300px ;">
				
			</div>
	
		<h1>Firebase Cloud Messaging (FCM) Server in PHP</h1>	
		<form method="post" action="sendMultipleFCM.php">
		 <h3>FIREBASE SERVER KEY</h3>					                             
			<div>                                
				<input type="text" class="large" name="serverapi" size="55" placeholder="Enter Your Server KEY"></textarea>
			</div>
		 <h3>DEVICE TOKEN OR REG.ID</h3>					                             
			<div>                                
				<input class="large" name="token" size="55" placeholder="Enter Device Token or Reg.ID"></textarea>
			</div>
		 <h3>DEVICE TOKEN OR REG.ID-2</h3>					                             
			<div>                                
				<input class="large" name="token2" size="55" placeholder="Enter Device Token or Reg.ID-2"></textarea>
			</div>
		 <h3>Message</h3>					                             
			<div>                                
				<textarea rows="6" name="message" cols="63" placeholder="Message to transmit via FCM"></textarea>
			</div>
		 <h3>Title</h3>	
			<div>                                
				<input class="large" name="title" size="55" placeholder="Title to transmit via FCM"></textarea>
			</div>
			<h3> Include Image? </h3>
			<input type="radio" name="isImage" id="no" value="Yes" checked/>Yes
                        <input type="radio" name="isImage" id="no" value="No">No<br>
			<input type="submit" name="submit" value="Go Go Go...!" id="submit" /><br>
			
		</form>
		<p><h3><?php echo $pushStatus; ?></h3></p>        
    </body>
</html>

I have save above file here in my server: http://demonuts.com/Demonuts/JsonTest/Tennis/sendMultipleFCM.php

Upgrade above file where there is a code like

header(“Location: http://demonuts.com/Demonuts/JsonTest/Tennis/sendMultipleFCM.php”)

with your server path or localhost path.

Testing your push notification without creating PHP Script

If you want to send push notification directly to your android device, then go to

http://www.demonuts.com/Demonuts/JsonTest/Tennis/sendMultipleFCM.php

Fill required details (Firebase Server Key, Device Tokens etc.) and click on the Go Go Go button.

Provide two device tokens to get notifications on them.

You can also enter only device token and keep another empty. Of course Notification will be sent to only one device.

Use comment section to give your review or to ask any question.

So all for Android firebase push notification programmatically example tutorial. Thank you.