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



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

1171   17  

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. я.е

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 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).

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

в соответствии с руководящими принципами дизайна 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, и это будет показывать окно следующим образом: -

enter image description here

enter image description here

я столкнулся с той же проблемой, и это было из-за моего значка уведомления приложения не было плоским. Для версии 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

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

  1. пример

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

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

  1. измените стиль statusbarStyle в файле конфигурации. пример

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

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

  1. сделайте свой значок прозрачным. Это решение работало для многих людей. На самом деле дело в том, что разработка нативного приложения нам нужно предоставить им три изображения: (а)значок приложения (б)значок уведомления (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"
}

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

Comments

    Ничего не найдено.