#android #notifications
#Android #уведомления
Вопрос:
Я бы хотел, чтобы мои уведомления включали изображение контакта. Я использую NotificationCompat, а MessagingStyle отображает сообщения чата для контактов.
Это работает при использовании .setIcon для пользователя, но изображение квадратное, поэтому я хотел бы использовать setUri, но оно не отображает изображение, вместо этого я вижу первый инициал контакта в круге.
Вот код, который я использую для уведомления.
Person person = new Person.Builder()
// .setIcon(contactIcon)
.setName(displayName)
.setUri(contentLookupURI)
.setKey(contactDetail)
.build();
NotificationCompat.MessagingStyle chatMessageStyle = new NotificationCompat.MessagingStyle(person);
NotificationCompat.MessagingStyle.Message notificationMessage = new
NotificationCompat.MessagingStyle.Message(
contentText,
System.currentTimeMillis(),
person
);
chatMessageStyle.addMessage(notificationMessage);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, NOTIFICATION_MESSAGES_CHANNEL_ID)
.setSmallIcon(icon) // notification icon
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setStyle(chatMessageStyle)
.setOnlyAlertOnce(true)
.setContentTitle(displayName);
И для URI контакта, используемого в .setUri
я использую библиотеку для получения идентификатора контакта и поискового ключа, затем использую метод:
contactLookupURI =
ContactsContract.Contacts.getLookupUri(contactsList.get(0).getId(),
contactsList.get(0).getLookupKey());
Что приводит к этому: content://com.android.contacts/contacts/lookup/3118r4-2F294339313F5B16.3789r5-2F294339313F5B16/6
который выглядит правильным для меня.
Я не уверен, насколько нова эта форма метода MessagingStyle, поскольку я не могу найти много примеров его использования с объектом Person.
Комментарии:
1. что, если у всех контактов нет изображения
2. лол @ManojPerumarath, я проверил, у них действительно есть изображения, и это работает, когда я использую setIcon с фотографией контактов, надеюсь, ты это имеешь в виду
3. Вы когда-нибудь разбирались с этим?
4. @Bink нет, в итоге я сгенерировал и настроил растровое изображение вручную с помощью округленного BitmapDrawable
Ответ №1:
Вот решение для тех, кто использует удаленный URL с Glide
Шаг 1: Получить растровое изображение с удаленного URL
private fun getAvatarFromUrl(photoUrl: String): Bitmap? {
return try {
val futureTarget = Glide.with(this)
.asBitmap()
.load(photoUrl)
.submit()
futureTarget.get()
} catch (e: Exception) {
Timber.e(e)
null
}
}
Шаг 2: Установите растровое изображение в качестве Лица.Значок
val avatar = getAvatarFromUrl(user.avatar)
val sender = Person.Builder()
.setName(msg.from?.name)
.setIcon(IconCompat.createWithBitmap(avatar))
.setImportant(true)
.build()
Ответ №2:
Если вы хотите использовать идентификатор ресурса вместо растрового изображения:
val person = Person.Builder()
.setName("Name")
.setKey("Key")
.setIcon(IconCompat.createWithResource(this, R.drawable.ic_resource)).build()