17 ответов:
принятый ответ не является (полностью) правильным. Конечно, это заставляет значки уведомлений отображаться в цвете, но делает это с большим недостатком - установив целевой 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; }
полностью согласен с пользователем Daniel Saidi. Для того, чтобы иметь
ColorнаNotificationIconЯ пишу этот ответ.для этого вы должны сделать значок, как
Silhouetteи сделать какой-то разделTransparentвезде, где вы хотите добавить свойColors. я.е
вы можете добавить свой цвет с помощью
.setColor(your_color_resource_here)Примечание :
setColorдоступно только вLollipopИтак, вы должны проверитьOSVersionif (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 Developer Console Notification Guide Lines.предпочтительный размер значка уведомления 24x24dp
mdpi @ 24.00dp = 24.00px hdpi @ 24.00dp = 36.00px xhdpi @ 24.00dp = 48.00pxа также обратитесь по этой ссылке для Размеры Значков Уведомлений для получения дополнительной информации.
это код, который 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 }в противном случае (затмение и т. д.) использовать
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), поэтому скопируйте полученный до
\AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi. Используйте.setSmallIcon(R.drawable.ic_notification)в вашей код, или использоватьgetNotificationIcon()как Даниэль Саиди предложил выше.вы также можете использовать Android Asset Studio Романа Нурика.
другой вариант заключается в использовании специфичных для версии drawable (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
в соответствии с руководящими принципами дизайна 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 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()); }неправильный значок
Справа Значок
альфа-канал это единственные данные изображения, которое 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.
удалить
android:targetSdkVersion="21"из манифеста.XML. это сработает! и от этого нет никакой проблемы вообще в вашем apk это просто трюк я применяю это, и я нашел красочный значок в уведомлении
уведомления оттенков серого как объяснено ниже. Они не черно-белые, несмотря на то, что пишут другие. Вероятно, вы видели значки с несколькими оттенками, например, полосы прочности сети.
до 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 показывает, что Альфа-компоненты не игнорируется; вместо этого, они по-прежнему предоставлять градации серого. Более высокие значения Альфа делают пиксель белым. Более низкие Альфа-значения превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении. (Кажется, другие сообщили немного другое поведение, так что будьте в курсе!)
Post android Lollipop release android изменил рекомендации по отображению значков уведомлений в панели уведомлений. В официальной документации говорится: "обновление или удаление активов, связанных с цветом. Система игнорирует все не-альфа-каналы в значках действий и в главном значке уведомлений. Вы должны предположить, что эти значки будут только альфа. Система рисует значки уведомлений в белом цвете и значки действий в темно-сером цвете." Теперь то, что это означает в терминах мирянина, это " конвертировать все части изображение, которое вы не хотите показывать прозрачные пиксели. Все цвета и непрозрачные пиксели отображаются белым цветом"
вы можете увидеть, как это сделать, подробно со скриншотами здесь https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
надеюсь, что это поможет
Если вы используете GoogleFireBaseMessaging, вы можете установить "идентификатор значка" в полезной нагрузке "уведомление" (это помогает мне решить проблему с белой полосой значков):
{ "to":"<fb_id>", "priority" : "high", "notification" : { "title" : "title", "body" : "body" , "sound" : "default", "icon" : "ic_notification" } }set ic_notification к вашему собственному id от R. drawable.
Я также столкнулся слишком много проблем в этом, но после поиска по всему интернету я нашел различные решения для этой проблемы.Позвольте мне подвести итог всем решениям и объяснить:
Примечание: это решение для пользователей Phonegap cordova
<preference name="android-targetSdkVersion" value="20"/>вам нужно установить android-targetSdkVersion значение менее 21. Так что после установки этого значения значок уведомления изображение появится до Android 6 (зефир), он не будет работать в Android 7(Нуга). Это решение сработало для меня.
- измените стиль statusbarStyle в файле конфигурации. пример
<preference name="StatusBarStyle" value="lightcontent" />но это решение будет работать только при открытии приложения. Итак, я думаю, что это решение не самое лучшее решение, но оно сработало для многих пользователей.
- сделайте свой значок прозрачным. Это решение работало для многих людей. На самом деле дело в том, что разработка нативного приложения нам нужно предоставить им три изображения: (а)значок приложения (б)значок уведомления (c) изображение значка строки состояния, но в случае разработки гибридных мобильных приложений нет возможности сделать это. Поэтому сделайте свой значок прозрачным, и это решение решит вашу проблему.
и я уверен, что одно из вышеуказанных решений будет работать для вашего вопроса.
FYI: если значок не отображается, убедитесь, что ваша локальная или удаленная конфигурация уведомлений содержит правильное имя значка, т. е.
'largeIcon' => 'ic_launcher', 'smallIcon' => 'ic_launcher' // defaults to ic_launcher,
смешайте эти две вещи в приложении 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" }







Comments