Trying to send fcm notifications using retrofit library in android. I want to show notification with title and message to other android device. Here is the code and sample files used for push notification.
Function to Send Push Notification Using Retrofit Call:
private void sendNotification(String deviceId,String sender,String message)
{
FirebaseApi apiService =
FirebaseClient.getClient().create(FirebaseApi.class);
NotifyData notifydata = new NotifyData(sender,message);
Call<FirebaseMessage> call = apiService.sendMessage(new
FirebaseMessage(deviceId, notifydata));
call.enqueue(new Callback<FirebaseMessage>() {
@Override
public void onResponse(Call<FirebaseMessage> call,
Response<FirebaseMessage> response) {
Log.e("Message Response","Send");
}
@Override
public void onFailure(Call<FirebaseMessage> call, Throwable t) {
Log.e("Message Response","Fail");
}
});
}
FirebaseMessage Class:
public class FirebaseMessage {
String to;
NotifyData notification;
public FirebaseMessage(String to, NotifyData notification) {
this.to = to;
this.notification = notification;
}
}
NotifyData Class:
public class NotifyData {
String title;
String body;
public NotifyData(String title, String body ) {
this.title = title;
this.body = body;
}
}
FirebaseClient Class:
public class FirebaseClient {
public static Retrofit RETROFIT = null;
public static Retrofit getClient(){
if(RETROFIT==null){
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
RETROFIT = new Retrofit.Builder()
.baseUrl(StaticConfig.FIREBASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return RETROFIT;
}
}
FirebaseApi Class:
public interface FirebaseApi {
@Headers({"Authorization: key=Legacy Service Key",
"Content-Type:application/json"})
@POST("fcm/send")
Call<FirebaseMessage> sendMessage(@Body FirebaseMessage message);
}
In MyFirebaseMessagingService Class:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String title=remoteMessage.getData().get("title");
String body=remoteMessage.getData().get("body");
sendNotification(title, body);
}
But it shows blank notification every time with null title and null body. How to retreive my notifydata through remoteMessage Properly.
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
public class ApiClient {
private static final String BASE_URL = "https://fcm.googleapis.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
public interface ApiInterface {
@Headers({"Authorization: key=" + ConstantKey.SERVER_KEY, "Content-Type:application/json"})
@POST("fcm/send")
Call<ResponseBody> sendNotification(@Body RootModel root);
}
public class RootModel {
@SerializedName("to") // "to" changed to token
private String token;
@SerializedName("notification")
private NotificationModel notification;
@SerializedName("data")
private DataModel data;
public RootModel(String token, NotificationModel notification, DataModel data) {
this.token = token;
this.notification = notification;
this.data = data;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public NotificationModel getNotification() {
return notification;
}
public void setNotification(NotificationModel notification) {
this.notification = notification;
}
public DataModel getData() {
return data;
}
public void setData(DataModel data) {
this.data = data;
}
}
public class NotificationModel {
private String title;
private String body;
public NotificationModel(String title, String body) {
this.title = title;
this.body = body;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
public class DataModel {
private String name;
private String age;
public DataModel(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
private void sendNotificationToUser(String token) {
RootModel rootModel = new RootModel(token, new NotificationModel("Title", "Body"), new DataModel("Name", "30"));
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
retrofit2.Call<ResponseBody> responseBodyCall = apiService.sendNotification(rootModel);
responseBodyCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
Log.d(TAG,"Successfully notification send by using retrofit.");
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
}
Whoah, when i try a answer from @Mustofa Kamal. i got problem about model because i got error code 400 that's mean error parsing with format JSON. so that, i use JsonObject as data parsing into json format like this
JsonObject jNotif = new JsobObject()
jNotif.addProperly("title","hello world");
jNotif.addProperly("body","hello this world");
JsonObject jFCM = new JsonObject()
jFCM.add("notification",jNotif);
jFCM.addProperly("to",<your_token_from_firebase>);
and i use in ApiInterface interface like this :
@Headers({"Content-Type: application/json","Authentication: <your_server_key>"})
@POST("/fcm/send")
Call<<your_model_response>> createFirebaseCloudM(@Body <your_model_class>);
i include that code in method fill retrofit response. i know you how about handle a response from retrofit and it same with above answer. but, without model when you send a data
hope it will be help...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.