it-roy-ru.com

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

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

201
Alejandro Casanova

Принятый ответ не является (полностью) правильным. Конечно, это заставляет значки уведомлений отображаться в цвете, но делает это с БОЛЬШИМ недостатком - устанавливая целевой 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;
}
266
Daniel Saidi

Полностью согласен с пользователем 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

А также обратитесь к этой ссылке для Размеры значков уведомлений для получения дополнительной информации.

68
Jaydipsinh Zala

Этот код 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 Design Guide : _ ​​"Значки уведомлений должны быть полностью белыми."

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

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

defaultConfig {
    targetSdkVersion 20
}

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

<uses-sdk Android:minSdkVersion="..." Android:targetSdkVersion="20" />
47
ByteHamster

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

  • выберите рисунок, откройте в IrfanView, нажмите F12 для инструментов рисования, при необходимости очистите рисунок (удалите ненужные детали, выровняйте и отполируйте)
  • Image / Decrease Color Depth до 2 (для черно-белой картинки)
  • Image / Negative (для черно-белой картинки)
  • Image / Resize/Resample до 144 x 144 (используйте метод размера «Resize», а не «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(), как предложил Даниэль Саиди выше.

Вы также можете использовать Android Asset Studio Романа Нурика .

23
Thomas H. Schmidt

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

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

 File system

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

 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

14
Ian

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

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) с вашим строителем.

12
Muhammad Babar

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

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

Вы можете получить доступ к Image Asset, щелкнув новый>, щелкнув опцию Image Asset, и окно будет отображено так: - 

 enter image description here

 enter image description here

10
NishchalAndroid

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

Ниже приведен код, который отлично работал на всех версиях 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

8
Nauman Zubair

alpha-channel - это единственные данные изображения, которые 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.

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

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

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

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

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

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

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

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

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

3
Jeremy Frank

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

3
Bhanu Sharma

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

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

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

2
Rohit Khanna

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

2
abhi.nalwade

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

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

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

1
Maxim Firsoff

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

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

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

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

  1. Пример

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

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

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

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

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

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

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

0
Rinku kumar

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

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

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

0
Laurent

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

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

RemoteView-х

setImageViewResource(int viewId, int srcId);

а также

setImageViewUri(int viewId, Uri uri); 

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

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

setImageViewBitmap(int viewId, Bitmap bitmap);

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

0
Cake Lime