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

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

    Notification notification = new NotificationCompat.Builder(context)

    .setContentTitle(title)

    .setContentText(message)

    .setContentIntent(intent)

    .setSmallIcon(bitmap)

    .setWhen(when)

    .build(); 

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

Edit:

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

          Notification notification = new NotificationCompat.Builder(context)

        .setContentTitle(title)

        .setContentText(message)

        .setContentIntent(intent)

        .setSmallIcon(icon)

        .setLargeIcon(bitmap)

        .setWhen(when)

        .build();

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

Ответ 1

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

Загрузка изображения, преобразование в растровое изображение, а затем установка его на 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.

Ответ 3

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

1-й:

Вы можете установить 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);

2-й:

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

3-й:

К счастью, поддержка была расширена до типа 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);

Ответ 4

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

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



.setSmallIcon(getApplicationInfo().icon)
.setLargeIcon(bitmap)

Ответ 5

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