I'm facing a problem adding an image to the username in my app's notifications. I honestly tried to figure it out, but couldn’t find any information. I would be very grateful for your help.
enter image description here (The black circles are where the avatar should be.)
Future<void> showSenderAvatarNotification(RemoteMessage message) async {
try {
final data = message.data;
final senderPhotoUrl = data['senderPhotoUrl'] ?? '';
final senderName = data['senderName'] ?? 'Неизвестный';
final messageText = data['messageText'] ?? '';
final chatId = data['chatId'] ?? 'default_chat';
final String groupKeyIndividual = 'chat_${chatId}_$senderName';
final int notificationId = groupKeyIndividual.hashCode;
Uint8List? avatarBytes;
if (senderPhotoUrl.isNotEmpty) {
try {
final response = await http.get(Uri.parse(senderPhotoUrl));
if (response.statusCode == 200) {
final Uint8List downloadedBytes = response.bodyBytes;
avatarBytes = await cropImageToCircle(downloadedBytes, size: 200);
} else {
print('Ошибка загрузки фото. Код ответа: ${response.statusCode}');
}
} catch (e) {
print('Ошибка при загрузке фото: $e');
}
}
if (avatarBytes == null) {
final Uint8List generatedBytes = await generateInitialLetterAvatar(
senderName.isNotEmpty ? senderName[0] : '?');
avatarBytes = await cropImageToCircle(generatedBytes, size: 200);
}
// Сохраняем аватарку в файл
final String avatarFilePath =
await _saveBytesToFile(avatarBytes, 'avatar_${notificationId}.png');
// Сохраняем аватарку в глобальной мапе для создания коллажа в summary
final String mapKey = '$chatId#$senderName';
_chatAvatars[mapKey] = avatarBytes;
if (!_groupMessagesBySender.containsKey(mapKey)) {
_groupMessagesBySender[mapKey] = [];
}
_groupMessagesBySender[mapKey]!
.add(MyMessage(messageText, DateTime.now(), MyPerson(name: senderName)));
// Создаем объект Person для MessagingStyle из пакета fln, используя иконку из файла.
final fln.Person messagingPerson = fln.Person(
name: senderName,
icon: fln.BitmapFilePathAndroidIcon(avatarFilePath),
);
// Преобразуем список наших сообщений в объекты fln.Message
final List<fln.Message> messagingMessages = _groupMessagesBySender[mapKey]!
.map((myMsg) => fln.Message(
myMsg.text,
myMsg.date,
messagingPerson,
))
.toList();
// Создаем стиль уведомления MessagingStyleInformation с groupConversation: true,
// чтобы аватарка отправителя отображалась рядом с заголовком уведомления.
final fln.StyleInformation messagingStyle =
fln.MessagingStyleInformation(
messagingPerson,
conversationTitle: senderName,
groupConversation: false,
messages: messagingMessages,
);
final fln.AndroidNotificationDetails individualAndroidDetails =
fln.AndroidNotificationDetails(
'chat_channel_id',
'Chat Notifications',
groupAlertBehavior: fln.GroupAlertBehavior.all,
channelDescription: 'Уведомления из чатов',
importance: fln.Importance.max,
priority: fln.Priority.high,
category: fln.AndroidNotificationCategory.message,
styleInformation: messagingStyle,
largeIcon: fln.FilePathAndroidBitmap(avatarFilePath),
icon: '@drawable/ic_notification'
);
final fln.NotificationDetails individualDetails =
fln.NotificationDetails(android: individualAndroidDetails);
await flutterLocalNotificationsPlugin.show(
notificationId,
'',
messageText,
individualDetails,
payload: mapKey,
);
// Формирование сводного уведомления (summary) для всех чатов.
// Создаем составной коллаж из аватарок всех чатов.
final List<Uint8List> avatars = _chatAvatars.values.toList();
final Uint8List collageBytes = await createAvatarsCollage(avatars, size: 200);
final String collagePath = await _saveBytesToFile(collageBytes, 'collage.png');
final int totalMessages = _groupMessagesBySender.values.fold<int>(
0, (sum, list) => sum + list.length);
final int summaryNotificationId = 0;
final String summaryContent = 'Новые сообщения';
final String summaryText = 'У вас $totalMessages новых сообщений';
final fln.AndroidNotificationDetails summaryAndroidDetails =
fln.AndroidNotificationDetails(
'chat_channel_id',
'Chat Notifications',
channelDescription: 'Сводка уведомлений по чатам',
importance: fln.Importance.max,
priority: fln.Priority.high,
groupKey: 'all_chats',
category: fln.AndroidNotificationCategory.message,
setAsGroupSummary: true,
icon: '@drawable/ic_notification',
largeIcon: fln.FilePathAndroidBitmap(collagePath),
);
final fln.NotificationDetails summaryNotificationDetails =
fln.NotificationDetails(android: summaryAndroidDetails);
await flutterLocalNotificationsPlugin.show(
summaryNotificationId,
summaryContent,
summaryText,
summaryNotificationDetails,
);
} catch (e, stack) {
print('Ошибка при показе уведомления: $e\n$stack');
}
}
I tried different options in different classes, but never found success.
I set groupConversation = true, but then the avatar was displayed twice (near the title and where it is now)