У меня есть приложение, показывающее настраиваемые уведомления. Проблема в том, что при работе в Android 5 маленький значок на панели уведомлений отображается белым цветом. Как я могу это исправить?
Значок панели уведомлений становится белым в Android 5 Lollipop
Ответы (20)
Принятый ответ не является (полностью) правильным. Конечно, он заставляет значки уведомлений отображаться в цвете, но делает это с БОЛЬШИМ недостатком - устанавливая целевой 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;
}
targetSdkVersion
! = maxSdkVersion
= ›Если вы не используете новые API, представленные в Lollipop, это не проблема. Приложение будет работать без проблем. (Конечно, вы должны следовать рекомендациям по дизайну и подумать о том, чтобы в будущем переключиться на белый значок)
- person ByteHamster; 23.03.2015
ctrl+f
и набираю notification
на этой странице он ничего не может найти ...
- person user25; 17.09.2016
Полностью согласен с пользователем Daniel Saidi. Чтобы иметь Color
для NotificationIcon
я пишу этот ответ.
Для этого вам нужно сделать иконку типа Silhouette
и сделать какой-нибудь раздел Transparent
, куда вы хотите добавить свой Colors
. т.е.
Вы можете добавить свой цвет, используя
.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
Также перейдите по этой ссылке, чтобы получить дополнительную информацию о размерах значков уведомлений.
setColor
на Kitkat (API 19) и IceCreamSandwich (API 15), в обоих случаях цвет игнорировался, но не происходил сбой. Так можно ли не проверять версию ОС?
- person Maria; 08.08.2017
Это код, который 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" />
Чтобы значки уведомлений не стали белыми, используйте для них значки «Силуэт», т.е. белые на прозрачном фоне изображения. Вы можете использовать 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 Романа Нурика.
Другой вариант - использовать каталоги с возможностью рисования для конкретных версий (mipmap) для предоставления различной графики для Lollipop и более поздних версий.
В моем приложении каталоги «v21» содержат значки с прозрачным текстом, в то время как другие каталоги содержат непрозрачную версию (для версий Android старше Lollipop).
Это должно выглядеть примерно так:
Таким образом, вам не нужно проверять номера версий в коде, например
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
setColor
(без использования дополнительного кода)?
- person Daniel; 28.05.2018
Теперь студия Android предоставляет плагин Image Asset, который будет генерировать значок во всех необходимых папках drawbale.
Image Asset Studio помогает создавать значки различных типов с разной плотностью и показывает, где именно они будут размещены в вашем проекте. Он включает в себя инструменты для настройки ваших значков и добавления фонов, при этом результат отображается на панели предварительного просмотра, поэтому они выглядят именно так, как вы планировали. Эти инструменты могут значительно упростить процесс создания и импорта значков.
Вы можете получить доступ к объекту изображения, нажав «Создать»> «Выбрать объект изображения», и появится следующее окно: -
В соответствии с рекомендациями по дизайну Android вы должны использовать силуэт для builder.setSmallIcon(R.drawable.some_notification_icon);
. Но если вы все же хотите отображать красочный значок в качестве значка уведомления, вот трюк для леденца на палочке и выше, используйте приведенный ниже код. 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)
с вашим конструктором.
Я столкнулся с той же проблемой, потому что значок уведомления моего приложения не был плоским. Для леденца на палочке версии 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());
}
Неправильный значок
Правый значок
альфа-канал - это единственные данные изображения, которые 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, официально подтверждающий это.
Проверено на Android 22.
setColor
на Kitkat (API 19) и IceCreamSandwich (API 15), в обоих случаях цвет игнорировался, но не происходил сбой. Так можно ли не проверять версию ОС?
- person Maria; 08.08.2017
удалите android:targetSdkVersion="21"
из manifest.xml. это будет работать! и из этого в вашем apk нет никаких проблем, это просто трюк, я применяю это, и я нашел красочный значок в уведомлении
Уведомления отображаются в оттенках серого, как описано ниже. Они не черно-белые, несмотря на то, что написали другие. Вероятно, вы видели значки с несколькими оттенками, например, полосы мощности сети.
До API 21 (Lollipop 5.0) цветные значки работают. Вы можете заставить свое приложение ориентироваться на API 20, но это ограничивает функции, доступные вашему приложению, поэтому это не рекомендуется. Вы можете протестировать работающий уровень API и соответствующим образом установить либо цветной значок, либо значок в градациях серого, но это, вероятно, не имеет смысла. В большинстве случаев лучше использовать значок в оттенках серого.
Изображения имеют четыре канала, RGBA (красный / зеленый / синий / альфа). Для значков уведомлений Android игнорирует каналы R, G и B. Учитывается только канал Alpha, также известный как непрозрачность. Создайте свой значок с помощью редактора, который дает вам контроль над альфа-значением цветов вашего рисунка.
Как значения Alpha создают изображение в оттенках серого
- Альфа = 0 (прозрачный) - эти пиксели прозрачны, показывая цвет фона.
- Альфа = 255 (непрозрачный) - эти пиксели белые.
- Альфа = 1 ... 254 - Эти пиксели являются именно тем, что вы ожидаете, обеспечивая оттенки между прозрачным и белым.
Замена с помощью setColor
:
- # P6 #
# P7 #
# P8 #
Опубликовать выпуск Android Lollipop Android изменил правила отображения значков уведомлений на панели уведомлений. В официальной документации говорится: «Обновите или удалите ресурсы, содержащие цвет. Система игнорирует все не-альфа-каналы в значках действий и в главном значке уведомления. Вы должны предполагать, что эти значки будут только альфа-каналы. Система рисует значки уведомлений белым цветом. и значки действий темно-серого цвета ". С точки зрения непрофессионала это означает: «Преобразуйте все части изображения, которые вы не хотите отображать, в прозрачные пиксели. Все цвета и непрозрачные пиксели отображаются белым "
Вы можете подробно узнать, как это сделать, на скриншотах здесь https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
надеюсь, это поможет
Вам необходимо импортировать одноцветное прозрачное изображение PNG. Таким образом, вы можете установить цвет значка для маленького значка. В противном случае он будет отображаться белым на некоторых устройствах, таких как MOTO.
Если вы используете GoogleFireBaseMessaging, вы можете установить «id значка» в полезной нагрузке «уведомления» (это помогает мне решить проблему с белой полосой):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
установите ic_notification на свой собственный идентификатор из R.drawable.
Я также столкнулся со слишком большим количеством проблем, но после поиска по всему Интернету я нашел разные решения этой проблемы. Позвольте мне подвести итог всем решениям и объяснить:
Примечание. Это решение предназначено для пользователей Phonegap Cordova.
<preference name="android-targetSdkVersion" value="20"/>
Вам необходимо установить значение android-targetSdkVersion меньше 21. Таким образом, после установки этого значения изображение значка уведомления будет отображаться до Android 6 (Marshmallow), оно не будет работать в Android 7 (Nougat). Это решение сработало для меня.
- Измените statusbarStyle в своем файле конфигурации. Пример
<preference name="StatusBarStyle" value="lightcontent" />
Но это решение будет работать только тогда, когда ваше приложение открыто. Итак, я думаю, это решение не лучшее решение, но оно сработало для многих пользователей.
- Сделайте ваш значок прозрачным. Это решение сработало для многих. На самом деле дело в том, что при разработке собственного приложения нам необходимо предоставить им три изображения: (a) значок приложения (b) значок уведомления (c) изображение значка строки состояния, но в случае разработки гибридного мобильного приложения нет возможности Сделай так. Так что сделайте свой значок прозрачным, и это решение решит вашу проблему.
И я уверен, что одно из вышеперечисленных решений подойдет для вашей проблемы.
К вашему сведению: если значок не отображается, убедитесь, что ваша локальная или удаленная конфигурация уведомлений содержит правильное имя значка, т.е.
'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher,
Думаю, говорить об API 21 уже поздно, но я нашел простой способ.
При использовании 'Custom Notification (custom layout)' s,
RemoteView's
setImageViewResource(int viewId, int srcId);
а также
setImageViewUri(int viewId, Uri uri);
делает это изображение белым на Lollipop (API 21).
Но при использовании
setImageViewBitmap(int viewId, Bitmap bitmap);
Изображение не покрывается белой маской!
Согласно документации, начиная с Android 3.0 (API Level 11), значок уведомления должен быть белым:
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
«Значки в строке состояния состоят из простых белых пикселей на прозрачном фоне с альфа-смешением, используемым для гладких краев и внутренней текстуры, где это необходимо».
смешайте эти две вещи в приложении 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"
}
android:targetSdkVersion="20"
должно быть ‹21
.