Значок панели уведомлений становится белым в Android 5 Lollipop

У меня есть приложение, показывающее пользовательские уведомления. Проблема в том, что при работе в Android 5 маленький значок на панели уведомлений отображается белым цветом. Как я могу это исправить?

Ответ 1

Принятый ответ не является (полностью) правильным. Несомненно, он показывает значки уведомлений в цвете, но делает это с большим недостатком - установив целевой SDK ниже, чем Android Lollipop!

Если вы решите проблему с белым значком, установив целевой SDK на 20, как было предложено, ваше приложение не будет нацелено на Android Lollipop, что означает, что вы не можете использовать специальные функции Lollipop.

Посмотрите http://developer.android.com/design/style/iconography.html, и вы увидите, что белый стиль заключается в том, как уведомления должны отображаться в Android Lollipop.

В Lollipop Google также предлагает использовать цвет, который будет отображаться за значком уведомления (белый) - https://developer.android.com/about/versions/android-5.0-changes.html

Итак, я считаю, что лучшим решением является добавление значка силуэта в приложение и его использование, если на устройстве работает Android Lollipop.

Например:

Notification notification = new Notification.Builder(context)
            .setAutoCancel(true)
            .setContentTitle("My notification")
            .setContentText("Look, white in Lollipop, else color!")
            .setSmallIcon(getNotificationIcon())
            .build();

    return notification;

И в методе getNotificationIcon:

private int getNotificationIcon() {
    boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
    return useWhiteIcon ? R.drawable.icon_silhouette : R.drawable.ic_launcher;
}

Ответ 2

Полностью согласен с пользователем Daniel Saidi. Чтобы иметь Color для NotificationIcon, я пишу этот ответ.

Для этого вы должны сделать значок как Silhouette и сделать какой-то раздел Transparent, где бы вы не захотели добавить свой Colors. то есть,

enter image description here

Вы можете добавить свой цвет, используя

.setColor(your_color_resource_here)

ПРИМЕЧАНИЕ. setColor доступен только в Lollipop, поэтому вы должны проверить OSVersion

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    Notification notification = new Notification.Builder(context)
    ...
} else {
    // Lollipop specific setColor method goes here.
    Notification notification = new Notification.Builder(context)
    ...
    notification.setColor(your_color)
    ...            
}

Вы также можете достичь этого, используя Lollipop в качестве цели SDK.

Все инструкции, относящиеся к NotificationIcon, приведенные в Линии направляющих для консоли разработчика Google.

Значок значка предпочтительного уведомления 24x24dp

mdpi    @ 24.00dp   = 24.00px
hdpi    @ 24.00dp   = 36.00px
xhdpi   @ 24.00dp   = 48.00px

И еще ссылку на Значения значков уведомлений для получения дополнительной информации.

Ответ 3

Это код, который Android использует для отображения значков уведомлений:

// android_frameworks_base/packages/SystemUI/src/com/android/systemui/
//   statusbar/BaseStatusBar.java

if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
    entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
} else {
    entry.icon.setColorFilter(null);
}

Поэтому вам нужно установить целевую версию sdk на что-то <21, и значки будут оставаться цветными. Это уродливое обходное решение, но оно делает то, что ожидается. В любом случае, я предлагаю Google Правила разработки:. Значки уведомлений должны быть полностью белыми.

Вот как вы можете его реализовать:

Если вы используете Gradle/Android Studio для создания своих приложений, используйте build.gradle:

defaultConfig {
    targetSdkVersion 20
}

В противном случае (Eclipse и т.д.) используйте AndroidManifest.xml:

<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />

Ответ 4

Чтобы избежать появления значков уведомлений, чтобы повернуть белым цветом, используйте для них значки "Силуэт", т.е. белые-на-прозрачные фоновые изображения. Вы можете использовать Irfanview для их создания:

  • выберите изображение, откройте в IrfanView, нажмите F12 для инструментов рисования, при необходимости очистите изображение (удалите ненужные детали, гладьте и покройте).
  • Image / Decrease Color Depth до 2 (для черно-белого изображения)
  • Image / Negative (для белого на черном изображении)
  • Image / Resize/Resample до 144 x 144 (используйте метод размера "Изменить размер", а не "Resample", в противном случае изображение будет увеличено до 24 цветовых бит на пиксель (24 BPP) снова
  • File / Save as PNG, отметьте Show option dialog, отметьте Save Transparent Color, нажмите Save, затем щелкните по черному цвету на изображении, чтобы установить прозрачный цвет

Android, похоже, использует только разрешение изображения drawable-xxhdpi (144 x 144), поэтому скопируйте полученный файл ic_notification.png в \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi. Используйте .setSmallIcon(R.drawable.ic_notification) в своем коде или используйте getNotificationIcon(), как предложил Даниэль Сайди.

Вы также можете использовать студию Intel Nintec для Android.

Ответ 5

Другим вариантом является использование каталогов, ориентированных на конкретные версии (mipmap), для предоставления различной графики для Lollipop и выше.

В моем приложении каталоги "v21" содержат значки с прозрачным текстом, в то время как другие каталоги содержат непрозрачную версию (для версий Android старше Lollipop).

Файловая система

Что должно выглядеть примерно так:

Android Studio

Таким образом, вам не нужно проверять номера версий в коде, например.

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_notification)
        .setContentTitle(title)
        .setContentText(message)
        .setAutoCancel(true)
        .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

Аналогично, вы можете ссылаться на "ic_notification" (или все, что вы хотите называть) в своей полезной нагрузке GCM, если вы используете атрибут "icon".

https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support

Ответ 6

В соответствии с рекомендациями по дизайну Android вы должны использовать силуэт для builder.setSmallIcon(R.drawable.some_notification_icon);. Но если вы все еще хотите показать красочный значок в качестве значка уведомления, вот трюк для леденца и выше использования ниже кода. LargeIcon будет выступать в качестве основного значка уведомления, и вам также необходимо предоставить силуэт для smallIcon, поскольку он будет показан в правом нижнем углу большого файла Icon.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
     builder.setColor(context.getResources().getColor(R.color.red));
     builder.setSmallIcon(R.drawable.some_notification_icon);
     builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}

И pre-lollipop использует только .setSmallIcon(R.mipmap.ic_launcher) с вашим создателем.

Ответ 7

Теперь студия Android предлагает плагин Image Asset, который будет генерировать значок во всех требуемых папках с червями

Image Asset Studio помогает создавать различные типы значков с различной плотностью и показывает, где именно они будут размещаться в вашем проекте. Он включает инструменты для настройки значков и добавления фонов, при отображении результата в панели предварительного просмотра, поэтому они отображаются точно так, как вы планировали. Эти инструменты могут значительно упростить дизайн и импорт иконок.

Вы можете получить доступ к Агенту изображений, нажав кнопку "Создать" > нажмите "Свойства изображения", и оно будет отображаться следующим образом: -

введите описание изображения здесь

введите описание изображения здесь

Ответ 8

Я столкнулся с одной и той же проблемой, и из-за моего значка уведомления приложения не было плоским. Для версии lollipop для версии Android или даже ниже леденца значок вашего приложения должен быть плоским, не используйте значок с тенями и т.д.

Ниже приведен код, который отлично работал на всех версиях Android.

private void sendNotification(String msg) {

    NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent intent = new Intent(this, CheckOutActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg).setLights(Color.GREEN, 300, 300)
            .setVibrate(new long[] { 100, 250 })
            .setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}

Неправильный значок
enter image description here

Значок справа

enter image description here

Ответ 9

альфа-канал - это единственные данные изображения, которое Android использует для уведомлений:

  • alpha == 1: пиксели показывают белый
  • alpha == 0: пиксели отображаются как цвет, который вы выбрали в Notification.Builder#setColor(int)

Это упоминается в https://developer.android.com/about/versions/android-5.0-changes.html:

Система игнорирует все не-альфа-каналы в значках действий и в главном значке уведомления. Вы должны предположить, что эти значки будут только альфа-версиями.

Почти все встроенные чертежи кажутся подходящими альфа-изображениями для этого, поэтому вы можете использовать что-то вроде:

Notification.Builder.setColor(Color.RED)
                    .setSmallIcon(android.R.drawable.star_on)

но я все еще ищу API doc, который официально подтверждает это.

Протестировано на Android 22.

Ответ 10

удалите android:targetSdkVersion="21" из manifest.xml. это будет работать! и из этого нет никакой проблемы вообще в вашем apk, это просто трюк, который я применяю, и я нашел красочную иконку в уведомлении

Ответ 11

Уведомления greyscale, как описано ниже. Они не черно-белые, несмотря на то, что написали другие. Вероятно, вы видели значки с несколькими оттенками, например, полосы прочности сети.

До API 21 (Lollipop 5.0) работают значки цветов. Вы можете заставить приложение использовать таргетинг API 20, но это ограничивает возможности, доступные вашему приложению, поэтому его не рекомендуется. Вы можете протестировать уровень API-интерфейса и установить либо значок цвета, либо значок оттенка серого, но это, вероятно, не стоит. В большинстве случаев лучше всего использовать значок оттенков серого.

Изображения имеют четыре канала, RGBA (красный/зеленый/синий/альфа). Для значков уведомлений Android игнорирует каналы R, G и B. Единственным каналом, который считается, является Alpha, также известный как непрозрачность. Создайте свой значок с помощью редактора, который дает вам контроль над значением Alpha ваших цветов чертежа.

Как значения альфа генерируют изображение в оттенках серого:

  • Alpha = 0 (прозрачный) - эти пиксели прозрачны, отображая цвет фона.
  • Alpha = 255 (непрозрачный) - эти пиксели белые.
  • Alpha = 1... 254 - Эти пиксели именно то, что вы ожидаете, обеспечивая оттенки между прозрачным и белым.

Изменение его с помощью setColor:

  • Вызов NotificationCompat.Builder.setColor(int argb). Из документации для Notification.color:

    Цвет акцента (целое число ARGB, такое как константы в цвете), которое будет применяться стандартными шаблонами стиля при представлении этого уведомления. Текущая конструкция шаблона создает красочное изображение заголовка, накладывая изображение значка (трафаретное в белом) на поле этого цвета. Альфа-компоненты игнорируются.

    Мое тестирование с помощью setColor показывает, что компоненты Alpha не игнорируются; вместо этого они по-прежнему обеспечивают оттенки серого. Более высокие значения Alpha отображают белый цвет. Значения Lower Alpha превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении. (Кажется, что другие сообщили о немного другом поведении, поэтому имейте в виду!)

Ответ 12

Опубликовать Android android Lollipop версия Android изменила рекомендации по отображению значков уведомлений на панели уведомлений. В официальной документации говорится: "Обновляйте или удаляйте активы, которые включают цвет. Система игнорирует все не-альфа-каналы в значках действий и значке основного уведомления. Вы должны предположить, что эти значки будут только альфа-версией. Система рисует значки уведомлений в белом и значки действий в темно-сером цвете". Теперь это означает, что это означает "Преобразовать все части изображения, которые вы не хотите показывать прозрачным пикселям. Все цвета и непрозрачные пиксели отображаются белым цветом"

Вы можете увидеть, как сделать это подробно с помощью скриншотов здесь https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/

Надеюсь, что поможет

Ответ 13

Вам необходимо импортировать одноцветное прозрачное изображение PNG. Таким образом, вы можете установить цвет значка маленького значка. В противном случае он будет отображаться белым на некоторых устройствах, таких как MOTO

Ответ 14

Если вы используете GoogleFireBaseMessaging, вы можете установить "значок значка" в полезной нагрузке "уведомление" (это помогает мне решить проблему с белым значком):

{
    "to":"<fb_id>",
    "priority" : "high",
    "notification" : 
    {
        "title" : "title",
        "body" : "body" ,
        "sound" : "default",
        "icon" : "ic_notification"
    }
}

установите ic_notification свой собственный идентификатор из R.drawable.

Ответ 15

У меня также было слишком много проблем в этом, но после поиска по всему Интернету я нашел разные решения для этой проблемы. Позвольте мне подвести итог всем решениям и объяснить:

Примечание. Это решение предназначено для пользователей Phonegap cordova.

<preference name="android-targetSdkVersion" value="20"/>

Вам нужно установить значение вашего Android-targetSdkVersion меньше 21.  Поэтому после установки этого значения значок значка уведомлений появится до Android 6 (Marshmallow), он не будет работать в Android 7 (нуга). Это решение сработало для меня.

  1. Измените statusbarStyle в вашем файле конфигурации. Пример

<preference name="StatusBarStyle" value="lightcontent" />

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

  1. Сделайте свой значок прозрачным. Это решение работало для многих людей. На самом деле дело в том, что при разработке Нативного приложения нам нужно предоставить им три изображения: (a) Значок приложения (b) Значок уведомления (c) Изображение значка строки состояния, но в случае разработки гибридного мобильного приложения нет возможности сделать это. Сделайте свой значок прозрачным, и это решение решит вашу проблему.

И я уверен, что одно из вышеуказанных решений будет работать для вашей проблемы.

Ответ 16

FYI: Если значок не отображается, убедитесь, что локальная или удаленная конфигурация уведомлений содержит правильное имя значка i.e

'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher, 

Ответ 17

Я думаю, что уже слишком поздно говорить об API 21, но я нашел легкий путь.

При использовании пользовательских уведомлений (пользовательский макет),

RemoteView-х

setImageViewResource(int viewId, int srcId);

а также

setImageViewUri(int viewId, Uri uri); 

делает эти изображения белыми на Lollipop (API 21).

Но при использовании

setImageViewBitmap(int viewId, Bitmap bitmap);

Изображение не становится белой маской!

Ответ 18

Согласно документации, значок уведомления должен быть белым с Android 3.0 (API Level 11):

https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar

"Значки строки состояния состоят просто из белых пикселей на прозрачном фоне с альфа-смешиванием, используемым для сглаживания краев и внутренней текстуры, где это уместно".

Ответ 19

смешать эти две вещи в приложении Gradle

 defaultConfig {
    applicationId "com.example.abdulwahidvi.notificationproblem"
    minSdkVersion 16
    //This is the version that was added by project by default
    targetSdkVersion 26 <------ default
    // Changed it to version 20
    targetSdkVersion 20 <------ mine

    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

Ответ 20

android:targetSdkVersion="20" он должен быть < 21.