У меня есть приложение, показывающее пользовательские уведомления. Проблема в том, что при работе в Android 5 маленький значок на панели уведомлений отображается белым цветом. Как я могу это исправить?
У меня есть приложение, показывающее пользовательские уведомления. Проблема в том, что при работе в Android 5 маленький значок на панели уведомлений отображается белым цветом. Как я могу это исправить?
Ответы:
Принятый ответ не является (полностью) правильным. Конечно, это заставляет значки уведомлений отображаться в цвете, но делает это с большим недостатком - устанавливая целевой 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;
}
ctrl+f
и печатаю notification
на этой странице, он ничего не может найти ...
Полностью согласен с пользователем 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
даны в Руководстве по уведомлению консоли разработчика .
Предпочтительный размер значка уведомления 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
А также обратитесь к этой ссылке для размеров значков уведомлений для получения дополнительной информации.
setColor
Kitkat (API 19) и IceCreamSandwich (API 15), в обоих случаях он игнорировал цвет, но не падал . Так что я могу безопасно пропустить проверку версии ОС?
Этот код 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
(без использования дополнительного кода) таким образом?
В соответствии с рекомендациями по дизайну 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));
}
И предварительно леденец использовать только .setSmallIcon(R.mipmap.ic_launcher)
с вашим строителем.
Теперь в Android Studio есть плагин Image Asset , который будет генерировать иконку во всех необходимых папках drawbale.
Image Asset Studio помогает вам создавать различные типы значков с различной плотностью и показывает, где именно они будут размещены в вашем проекте. Он включает в себя инструменты для настройки ваших значков и добавления фонов, все при отображении результата на панели предварительного просмотра, чтобы они выглядели точно так, как вы планировали. Эти инструменты могут значительно упростить процесс создания и импорта иконок.
Вы можете получить доступ к Image Asset , щелкнув новый> щелкните по опции Image Asset, и это будет окно показа, как это: -
Я столкнулся с той же проблемой, и это было из-за того, что значок уведомления моего приложения не был плоским. Для леденца на андроид версии или даже ниже леденца на палочке значок уведомления вашего приложения должен быть плоским, не используйте значок с тенями и т. Д.
Ниже приведен код, который отлично работал на всех версиях 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), в обоих случаях он игнорировал цвет, но не падал . Так что я могу безопасно пропустить проверку версии ОС?
удалить android:targetSdkVersion="21"
из файла manifest.xml. это сработает! и от этого нет никаких проблем в вашем apk, это просто трюк, я применяю это, и я нашел красочный значок в уведомлении
Уведомления серого цвета как описано ниже. Они не черно-белые, несмотря на то, что написали другие. Возможно, вы видели значки с несколькими оттенками, например, шкалы силы сети.
До API 21 (Lollipop 5.0) работали цветные значки. Вы можете принудительно настроить ваше приложение на API 20, но это ограничивает возможности, доступные для вашего приложения, поэтому это не рекомендуется. Вы можете проверить работающий уровень API и соответственно установить либо цветную иконку, либо иконку в оттенках серого, но это, вероятно, не стоит. В большинстве случаев лучше всего использовать значок в оттенках серого.
Изображения имеют четыре канала RGBA (красный / зеленый / синий / альфа). Для значков уведомлений Android игнорирует каналы R, G и B. Единственный канал, который учитывается, это Альфа, также известный как непрозрачность. Создайте свой значок с помощью редактора, который дает вам контроль над альфа-значением цветов вашего рисунка.
Как альфа-значения генерируют серое изображение:
Изменяя это с setColor
:
Вызов NotificationCompat.Builder.setColor(int argb)
. Из документации для Notification.color
:
Акцентный цвет (целое число ARGB, например, константы в цвете), применяемый стандартными шаблонами стилей при представлении этого уведомления. Текущий дизайн шаблона создает красочное изображение заголовка, накладывая изображение значка (трафаретное на белый) поверх поля этого цвета. Альфа-компоненты игнорируются.
Мое тестирование с использованием setColor показывает, что компоненты Alpha не игнорируются; вместо этого они все еще предоставляют оттенки серого. Более высокие значения Alpha окрашивают пиксель в белый цвет. Более низкие значения альфа-канала превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении. (Кажется, другие сообщали о несколько ином поведении, так что будьте внимательны!)
После выхода Android Lollipop релиз Android изменил правила отображения значков уведомлений в панели уведомлений. Официальная документация гласит: «Обновляйте или удаляйте ресурсы, связанные с цветом. Система игнорирует все не-альфа-каналы в значках действий и в основном значке уведомлений. Следует учитывать, что эти значки будут только в альфа-формате. Система отображает значки уведомлений белым цветом. и значки действий темно-серого цвета ». Теперь, что это означает в терминах непрофессионала: «Преобразуйте все части изображения, которые вы не хотите показывать, в прозрачные пиксели. Все цвета и непрозрачные пиксели отображаются белым »
Вы можете увидеть, как сделать это подробно со скриншотами здесь https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
надеюсь, это поможет
Вам необходимо импортировать одноцветное прозрачное изображение PNG. Таким образом, вы можете установить цвет значка маленького значка. В противном случае он будет показан белым на некоторых устройствах, таких как MOTO
Если вы используете GoogleFireBaseMessaging, вы можете установить «идентификатор значка» в полезной нагрузке «уведомления» (это помогает мне решить проблему с иконкой белой полосы):
{
"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). Это решение сработало для меня.
<preference name="StatusBarStyle" value="lightcontent" />
Но это решение будет работать только тогда, когда ваше приложение открыто. Итак, я думаю, что это решение не лучшее решение, но оно работало для многих пользователей.
И я уверен, что одно из приведенных выше решений будет работать для вашей проблемы.
Я думаю, что уже слишком поздно говорить об API 21, но я нашел простой способ.
При использовании пользовательских уведомлений (пользовательский макет),
RemoteView-х
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
.