Anukool srivastav
Anukool srivastav

Reputation: 797

How to send firebase push notification to specific group of user for android

I Have created push notification service using Firebase and I can send notification to either all or single user having FCM id, but I have no idea how to send to specific user.

Also server panel is not created for handling push notification handling If any suggestion for that is there will help more.

Upvotes: 5

Views: 18354

Answers (4)

Alisher Aliev
Alisher Aliev

Reputation: 13

Enjoy !

public class NotificationSenderThread implements Runnable {
private String title;
private String message;
private String senderToken;
private String recieverToken;

public NotificationSenderThread(String title, String message, String senderToken, String recieverToken) {
    this.title = title;
    this.message = message;
    this.senderToken = senderToken;
    this.recieverToken = recieverToken;
}

@Override
public void run() {
    try{
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("title", title);
        jsonObject.put("message", message);
        jsonObject.put("fcm_token", senderToken);

        JSONObject mainObject = new JSONObject();
        mainObject.put("to", recieverToken);
        mainObject.put("data", jsonObject);

        URL url = new URL("https://fcm.googleapis.com/fcm/send");
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Authorization", "key=<SERVER KEY>");
        connection.setDoOutput(true);

        Log.e("sent",mainObject.toString());
        DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
        dStream.writeBytes(mainObject.toString());
        dStream.flush();
        dStream.close();

        String line;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder responseOutput = new StringBuilder();
        while((line = bufferedReader.readLine()) != null ){
            responseOutput.append(line);
        }
        bufferedReader.close();
        Log.e("output", responseOutput.toString());
    }
    catch (Exception e){
       Log.e("output", e.toString());
        e.printStackTrace();
    }
}

}

Upvotes: 0

Okikioluwa
Okikioluwa

Reputation: 113

I don't have enough reputation to edit Burhanuddin Rashid's answer but I think what the OP needs is:

You can replace "to: /topics/news" with registration_ids

{ 

   "registration_ids" : [
   "UserInstanceToken1",
   "UserInstanceToken2"
    ]
   "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
    }
}

The User Instance Token can be gotten by

FirebaseInstanceId.getInstance().getToken() in Android.

Upvotes: 1

Carlo
Carlo

Reputation: 835

In your android code:

    public static void sendNotificationToUser(String user, final String message) {
            Firebase ref = new Firebase(FIREBASE_URL);
            final Firebase notifications = ref.child("notificationRequests");

            Map notification = new HashMap<>();
            notification.put("us

ername", user);
        notification.put("message", message);

        notifications.push().setValue(notification);
    }

Create a node and put this code inside:

    var firebase = require('firebase');
var request = require('request');

var API_KEY = "..."; // Your Firebase Cloud Server API key

firebase.initializeApp({
  serviceAccount: ".json",
  databaseURL: "https://.firebaseio.com/"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
  var requests = ref.child('notificationRequests');
  ref.on('child_added', function(requestSnapshot) {
    var request = requestSnapshot.val();
    sendNotificationToUser(
      request.username, 
      request.message,
      function() {
        request.ref().remove();
      }
    );
  }, function(error) {
    console.error(error);
  });
};

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: 'https://fcm.googleapis.com/fcm/send',
    method: 'POST',
    headers: {
      'Content-Type' :' application/json',
      'Authorization': 'key='+API_KEY
    },
    body: JSON.stringify({
      notification: {
        title: message
      },
      to : '/topics/user_'+username
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

// start listening
listenForNotificationRequests();

More information with the following link, it is the same thing with a many devices:

Sending notification between android devices with Firebase Database and Cloud Messaging

Upvotes: 1

Burhanuddin Rashid
Burhanuddin Rashid

Reputation: 5370

Firebase Cloud Messaging (FCM) topic messaging allows you to send a message to multiple devices that have opted in to a particular topic. Based on the publish/subscribe model, topic messaging supports unlimited subscriptions for each app i.e your group is attached to specific topic like news group,sports group etc.

FirebaseMessaging.getInstance().subscribeToTopic("news");

To unsubscribe unsubscribeFromTopic("news")

From Server side you need to set up for specif topic i.e a group of user like this:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/news",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

"/topics/news" This will send notification to group of people who have subsribe the news topic

Upvotes: 5

Related Questions