Добавить изображение контакта в уведомление в стиле MessagingStyle ‘Person’

#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()