Установите Drawable или Bitmap в качестве значка в уведомлении в Android

Я загружаю изображение с сервера в виде растрового изображения и конвертирую его в рисуемый, теперь я хочу использовать этот рисунок в качестве значка уведомления. Но я не могу этого сделать. вот мой код:

    Notification notification = new NotificationCompat.Builder(context)

    .setContentTitle(title)

    .setContentText(message)

    .setContentIntent(intent)

    .setSmallIcon(bitmap)

    .setWhen(when)

    .build(); 

но значок представляет собой значение типа Resources int, поэтому, когда я его использовал, он выдает ошибку. Любая помощь

Редактировать:

Теперь я обновляю свой код, и теперь я делаю так:

          Notification notification = new NotificationCompat.Builder(context)

        .setContentTitle(title)

        .setContentText(message)

        .setContentIntent(intent)

        .setSmallIcon(icon)

        .setLargeIcon(bitmap)

        .setWhen(when)

        .build();

но он дает большой значок слева и маленький значок справа. Я не хочу этого, поэтому для этого я удаляю строку setSmallIcon и запускаю свой код, но он не показывает мне уведомления


person User42590    schedule 17.04.2013    source источник
comment
stackoverflow.com/a/16051724/931982... см. мой ответ здесь   -  person stinepike    schedule 17.04.2013
comment
лол по какой-то причине я не знаю почему .. маленький значок справа называется большим значком .. только там вы можете установить растровое изображение. В более высоком API вы можете создать собственное уведомление с пользовательским макетом.   -  person stinepike    schedule 17.04.2013
comment
ты пробовал с этим? Уведомление об уведомлении = новое уведомление (R.drawable.logo, App, System.currentTimeMillis());   -  person itsrajesh4uguys    schedule 17.04.2013


Ответы (4)


Если вы прочитаете документы для разработчиков, относящиеся к Notification.Builder, вы увидите, что setSmallIcon(int icon) требуется идентификатор ресурса в пакете приложения для использования.

Загрузка изображения, преобразование в растровое изображение и последующая установка его в setSmallIcon() все равно приведет к ошибке.

Даже если бы вы преобразовали Bitmap в Drawable, например, так:

Drawable d = new BitmapDrawable(getResources(), bmpFinal);

он все равно выдаст вам ошибку, потому что этот Drawable не существует в вашем пакете приложения.

Единственное возможное решение — использовать ресурс Drawable, существующий в вашем package, и установить для него метод setSmallIcon(). Типичное использование:

builder.setSmallIcon(R.drawable.ic_launcher);

Кроме того, для setLargeIcon (Bitmap icon) требуется экземпляр Bitmap. Без внесения каких-либо дополнительных изменений в ваш текущий код (поскольку у вас уже есть Bitmap), вы можете использовать его как есть, если он соответствует вашим требованиям.

Если нет, вам придется использовать ресурс Drawable, который уже присутствует в одной из папок drawable.

person Siddharth Lele    schedule 17.04.2013

вы можете попробовать использовать этот метод

 builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));

http://javatechig.com/android/android-notification-example-using-notificationcompat

person Remon Amin    schedule 27.09.2015
comment
Это не отвечает на вопрос ОП. - person boltup_im_coding; 20.01.2016
comment
Мне помогло, спасибо! - person user5646514; 24.06.2021

В этом вопросе есть некоторые моменты, в основном связанные с API 23+, если вас интересует только setSmallIcon, перейдите ко 2-й и 3-й темам.

1st :

Вы можете установить LargeIcon из Drawable (вместо идентификатора ресурса), как показано ниже.

Drawable drawable= ContextCompat.getDrawable(this,R.drawable.your_drawable);

            Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(context)
                            .setLargeIcon(bitmap)
                            .setContentTitle("hahah")
                            .setContentText("Tap to stop")
                            .setOngoing(true);

2nd :

Если вам нужно установить небольшую иконку в API ниже 23, вам нужно будет установить идентификатор ресурса, например R.drawable.your_resource. NotificationCompat.Builder не позволяет вам использовать Drawables или Bitmaps в setSmallIcon().

3rd :

к счастью, поддержка была расширена до типа Icon на setSmallIcon() в версии 23+ с использованием Notification.Builder, как показано ниже:

 Drawable drawable = ContextCompat.getDrawable(this,R.drawable.your_drawable);

            Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

            Notification.Builder mBuilder =
                    new Notification.Builder(context)
                            .setSmallIcon(Icon.createWithBitmap(bitmap))
                            .setLargeIcon(bitmap)
                            .setContentTitle("hahah")
                            .setContentText("Tap to stop")
                            .setOngoing(true);
person Lucas Ferraz    schedule 29.07.2016
comment
Спасибо за последнее, хотя до сих пор нет решения для старой версии. В любом случае полезно знать - person Jenix; 18.10.2016

Лучший вариант получить значок приложения

 Drawable drawable=getApplicationInfo().loadIcon(getPackageManager());
 Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();



.setSmallIcon(getApplicationInfo().icon)
.setLargeIcon(bitmap)
person Neeraj Singh    schedule 27.07.2017
comment
Отличный вариант, но будьте осторожны, это приводит к сбою приложения, если значок является адаптивным значком, поскольку панель инструментов Android их не поддерживает. - person nuKs; 25.01.2020