Вы получаете «некрасивый» JSON в уведомлении, потому что вы добавляете тело сообщения непосредственно как содержимое уведомления.
.setContentText(messageBody)
Извлеките соответствующую информацию из messageBody
и добавьтеэту информацию в .setContentText()
.
Чтобы получить данные из части data
, вы можете добавить что-то подобное в ваш onMessageReceived()
метод:
if (remoteMessage.getData().size() > 0) {
message = getDataWithKey(remoteMessage.getData(), "message");
title = getDataWithKey(remoteMessage.getData(), "title");
param1 = getDataWithKey(remoteMessage.getData(), "param1");
param2 = getDataWithKey(remoteMessage.getData(), "param2");
}
Затем добавьте этот метод:
private String getDataWithKey(Map<String, String> params, String fieldKey) {
String data = "";
try {
for (Map.Entry<String, String> param : params.entrySet()) {
String key = param.getKey();
String value = param.getValue();
if(key.contentEquals(fieldKey)){
if(!value.isEmpty()) {
data = value;
}
}
}
}
catch (Exception ex){
Log.e(TAG, " getDataWithKey -- " + ex.getMessage());
}
return data;
}
РЕДАКТИРОВАТЬ
«Уродливое» уведомление не приходит от Notification
оно приходитоткуда-то еще в вашем коде, потому что это те же самые данные, которые добавляются в этот код:
Map<String, Object> data = new HashMap<String, Object>();
data.put("wasTapped", false);
...
Я вижу, что вы используете по крайней мере в двух местах:
FCMPlugin.sendPushPayload( data );
и
for (String key : data.keySet()) {
intent.putExtra(key, data.get(key).toString());
}
Также учтите: Для более новых версий ОС Android требуется NotificationChannel
для правильной работы.Пример кода (вам необходимо изменить некоторые его части в соответствии с вашими потребностями):
private void sendNotification(String title, String messageBody, Map<String, Object> data) {
try{
Intent intent = new Intent(this, BusinessDetailActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
for (String key : data.keySet()) {
intent.putExtra(key, data.get(key).toString());
}
PendingIntent pendingIntent = PendingIntent.getActivity(this,
0,
intent,
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT); // PendingIntent.FLAG_ONE_SHOT);
String idNotification = createNotificationChannel();
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, idNotification)
.setContentTitle(title)
.setContentText(body)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setCategory(NotificationCompat.CATEGORY_PROMO)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)
.setSmallIcon(SMALL_ICON);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//TODO: You will need to define your own ID_NOTIFICATION!!
notificationBuilder.setChannelId(ID_NOTIFICATION);
}
NotificationManager notificationManager = getSystemService(NotificationManager.class);
//TODO: I use a random number generator, but you do what fits your needs
int idNot = CodeGenerator.getRandomNumber(10, 10000);
assert (notificationManager != null);
notificationManager.notify(idNot, notificationBuilder.build());
}
catch (Exception ex){
Log.e(TAG, " sendNotification --- " + ex.getMessage());
}
}
private String createNotificationChannel() {
//TODO: You will need to define your own ID_NOTIFICATION!!
String id = ID_NOTIFICATION;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String name = "Special Notification";
String desc = "Notification showing special information.";
int prio = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(id, name, prio);
channel.setShowBadge(true);
channel.setDescription(desc);
channel.setLightColor(Color.RED);
channel.enableLights(true);
channel.enableVibration(true);
NotificationManager manager = getSystemService(NotificationManager.class);
assert (manager != null);
manager.createNotificationChannel(channel);
}
}
catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
return id;
}