Is there any way to send Upstream notification message through FCM from one android device to another devices connected with Firebase database.
I know that XMPP server can then receive the upstream messages and send the notifications to the other devices.To receive messages sent with the upstream API i need to implement an XMPP server but there is any other way???
Is there any way to send Upstream notification message through FCM
from one android device to another devices connected with Firebase
database?
Currently it\'s NOT possible to send messages directly from one device to another.
(or at least it\'s not possible without introducing a HUGE security vulnerability: more details below)
Full details:
- Sending messages to a user device is a pretty serious action!
based on the payload a message can result in spam, phishing, execution of internal methods.
- You want this operation to be allowed only be trusted entities, this is why the FCM send API requires the
SERVER-API-KEY
in the authentication header.
- Adding the
SERVER-API-KEY
in your app code (or communicating it to the app in some other way) IS NOT SAFE. This because apk can be extracted, decompiled, inspected, executed on emulators, executed under debugging and so on.
The best way to implement this today: is to have some sort of server between the two devices:
[DeviceA] -- please send message to B --> [SERVER] -- fcmSendAPI --> [DeviceB]
The server can be as simple as a PHP page, or a more complex XMPP implementation.
An example in Node.js can be found here:
Sending notifications between devices with Firebase Database and Cloud Messaging
Finally, after 2 months of trying to maintain reliable server script myself, I suddenly found OneSignal. It\'s completely free, supports device-to-device push messages on iOS, Android, WP and browsers.
Hope, I won\'t get flag for promotion spam, but it\'s currently the only (and easiest) way to be completely \"backendless\".
Also, it\'s completely secure way. Nobody can send push unless he knows special OS user id, which you can store in Firebase Database protected by rules.
UPD: It\'s not a replacement for Firebase. It has only push service and nothing else
UPD2: Firebase now has Functions, and examples of it usage has sending FCM. You now don\'t need any other server or service. Read more in official samples https://github.com/firebase/functions-samples
After lots of try finally i got one solution and its work perfectly
Step 1 :Include two library.
compile \'com.squareup.okhttp3:okhttp:3.4.1\'
compile \'com.google.firebase:firebase-messaging:9.2.0\'
Step 2 : In your MainActivity or from where you want to send notifications.
OkHttpClient mClient = new OkHttpClient();
String refreshedToken = \"\";//add your user refresh tokens who are logged in with firebase.
JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);
Step 3: Create one async task which sends notifications to all devices.
public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
try {
JSONObject root = new JSONObject();
JSONObject notification = new JSONObject();
notification.put(\"body\", body);
notification.put(\"title\", title);
notification.put(\"icon\", icon);
JSONObject data = new JSONObject();
data.put(\"message\", message);
root.put(\"notification\", notification);
root.put(\"data\", data);
root.put(\"registration_ids\", recipients);
String result = postToFCM(root.toString());
Log.d(\"Main Activity\", \"Result: \" + result);
return result;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject resultJson = new JSONObject(result);
int success, failure;
success = resultJson.getInt(\"success\");
failure = resultJson.getInt(\"failure\");
Toast.makeText(MainActivity.this, \"Message Success: \" + success + \"Message Failed: \" + failure, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, \"Message Failed, Unknown error occurred.\", Toast.LENGTH_LONG).show();
}
}
}.execute();
}
String postToFCM(String bodyString) throws IOException {
public static final String FCM_MESSAGE_URL = \"https://fcm.googleapis.com/fcm/send\";
final MediaType JSON
= MediaType.parse(\"application/json; charset=utf-8\");
RequestBody body = RequestBody.create(JSON, bodyString);
Request request = new Request.Builder()
.url(Url.FCM_MESSAGE_URL)
.post(body)
.addHeader(\"Authorization\", \"key=\" + \"your server key\")
.build();
Response response = mClient.newCall(request).execute();
return response.body().string();
}
Step 4 : Call in onclick of your button
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage(jsonArray,\"Hello\",\"How r u\",\"Http:\\\\google.com\",\"My Name is Vishal\");
}
});