Android Push-уведомления: значок не отображается в уведомлении, вместо этого отображается Белый квадрат
мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю Белый квадрат.
Я попытался изменить размер png значка (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при использовании меньших размеров Белый квадрат меньше.
я погуглил эту проблему, а также правильный способ генерации уведомлений, и из того, что я прочитал мой код должен быть правильным. К сожалению, все не так как они должно быть.
мой телефон-это Nexus 5 с Android 5.1.1. Проблема также присутствует на эмуляторах, Samsung Galaxy s4 с Android 5.0.1 и Motorola Moto G с Android 5.0.1 (оба из которых я заимствовал, и не имею прямо сейчас)
код для уведомлений следует, и два скриншота. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать об этом.
спасибо всем.
@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
resultIntent.putExtras(bundle);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification;
Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.lg_logo)
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
notificationManager.notify(0, notification);
}


16 ответов:
причина: для 5.0 Lollipop "значки уведомлений должны быть полностью белыми".
Если мы решим проблему с белым значком, установив целевой SDK на 20, наше приложение не будет нацелен на Android Lollipop, а это значит, что мы не можем использовать Леденец-специфические особенности.
решение для целевого Sdk 21
Если вы хотите поддерживать значки материала леденца, то сделайте прозрачные значки для леденца и выше версии. Обратиться следующий: https://design.google.com/icons/
пожалуйста, посмотрите на http://developer.android.com/design/style/iconography.html, и мы увидим, что белый стиль-это то, как уведомления должны отображаться в Android Lollipop.
в Lollipop Google также предлагает использовать цвет, который будет отображаться за белым значком уведомления. Приведи Ссылку: https://developer.android.com/about/versions/android-5.0-changes.html
везде, где мы хотим добавить цвета https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
реализация Notification Builder для версии ниже и выше Lollipop OS будет:
Notification notification = new NotificationCompat.Builder(this); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { notification.setSmallIcon(R.drawable.icon_transperent); notification.setColor(getResources().getColor(R.color.notification_color)); } else { notification.setSmallIcon(R.drawable.icon); }Примечание: setColor доступен только в леденец, и это влияет только к фону значка.
это решит вашу проблему полностью!!
Если вы используете Google Cloud Messaging, то эта проблема не будет решена просто изменив значок. Например, это не будет работать:
Notification notification = new Notification.Builder(this) .setContentTitle(title) .setContentText(text) .setSmallIcon(R.drawable.ic_notification) .setContentIntent(pIntent) .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE) .setAutoCancel(true) .build();даже если ic_notification является прозрачным и белым. Он также должен быть определен в метаданных Манифеста, например:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_notification" />метаданные идут под
applicationтег, для справки.
Я действительно предлагаю следовать руководство по дизайну Google:
, который сказал "значки уведомлений должны быть полностью белый."
объявите этот код в Манифесте Android:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_name" />Я надеюсь, что это полезно для вас.
мы можем сделать как ниже:
создайте новый объект построителя уведомлений и вызовите
setSmallIcon()С помощью объекта Notification builder, как в приведенном ниже коде.создайте метод, в котором мы будем проверять, на какой версии ОС мы устанавливаем наше приложение . Если он находится ниже Lolipop I. E API 21, то он будет принимать обычный значок приложения с цветом фона иначе он будет принимать прозрачный значок приложения без фона. Таким образом, устройства, использующие версию ОС >= 21, установят фон цвет значка с помощью метода
setColor()класса построителя уведомлений.Пример Кода:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder)); private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { int color = 0x008000; notificationBuilder.setColor(color); return R.drawable.app_icon_lolipop_above; } return R.drawable.app_icon_lolipop_below; }
наконец-то у меня есть решение этой проблемы.
эта проблема возникает только тогда, когда приложение вообще не работает. (ни на заднем, ни на переднем плане). Когда приложение работает на переднем или заднем плане значок уведомления отображается правильно.(не белый квадрат)
Итак, мы должны установить ту же конфигурацию значка уведомления в интерфейсах API, что и в интерфейсе.
в интерфейс мы использовали Реагировать Уроженца и для уведомления толчка мы использовали react-native-FCM npm package.
FCM.on("notification", notif => { FCM.presentLocalNotification({ body: notif.fcm.body, title: notif.fcm.title, big_text: notif.fcm.body, priority: "high", large_icon: "notification_icon", // notification icon icon: "notification_icon", show_in_foreground: true, color: '#8bc34b', vibrate: 300, lights: true, status: notif.status }); });мы использовали FCM-push npm package используя узел.js в качестве бэкэнда для push-уведомлений и установить структуру полезной нагрузки следующим образом.
{ to: '/topics/user', // required data: { id:212, message: 'test message', title: 'test title' }, notification: { title: 'test title', body: 'test message', icon : 'notification_icon', // same name as mentioned in the front end color : '#8bc34b', click_action : "BROADCAST" } }что он в основном ищет notification_icon изображение, хранящееся локально в нашей системе Android.
Если вы хотите предоставить значок уведомления о поддержке lollipop, сделайте значок уведомления двух типов:
- обычный значок уведомления: для ниже леденец версии.
- значок уведомления с прозрачным фоном : для Lollipop и выше версии.
теперь установите соответствующий значок в Notification builder во время выполнения базы на версии ОС:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent); } else { mBuilder.setSmallIcon(R.drawable.ic_push_notification); }
уведомления оттенков серого как объяснено ниже. Они не черно-белые, несмотря на то, что пишут другие. Вероятно, вы видели значки с несколькими оттенками, например, полосы прочности сети.
до 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 показывает, что Альфа-компоненты не игнорируется. Более высокие альфа-значения превращают пиксель белый. Более низкие Альфа-значения превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении.
попробуй такое
я столкнулся с той же проблемой,я пробовал много anwers, но не получил никаких решений, наконец, я нашел способ решить мою проблему.
- сделать значок уведомления с прозрачным фоном .Ширина и высота приложения должны быть как ниже размеров и вставить все это в свой проект - > app - >src - >main - >res
MDPI 24*24
HDPI 36*36
XHDPI 48*48
XXHDPI 72 * 72
после выше вставить эту строку ниже в вашем onmessagereceived метод
Intent intent = new Intent(this, News.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { notificationBuilder.setSmallIcon(R.drawable.notify) // .setContentTitle(title) // .setContentText(message) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); } else { notificationBuilder.setSmallIcon(R.drawable.notify) // .setContentTitle(title) // .setContentText(message) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); } NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build());не забудьте добавить этот код в файл манифеста
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/app_icon" />
требования для устранения этой проблемы:
формат изображения: 32-битный PNG (с Альфой)
изображение должно быть прозрачным
индекс цвета прозрачности: Белый (FFFFFF)
источник:http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_notification" />добавить эту строку в манифест.XML-файл в блок
вы можете использовать разные иконки для разных версий. Просто установите логику на свой значок следующим образом:
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
для SDK >= 23, пожалуйста, добавьте setLargeIcon
notification = new Notification.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(context.getResources(), R.drawable.lg_logo)) .setContentTitle(title) .setStyle(new Notification.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setContentText(msg) .setContentIntent(contentIntent) .setSound(sound) .build();
Я нашел ссылку, где мы можем создать наш собственный белый значок
попробуй эту ссылку, чтобы создать белый значок вашего иконку лаунчера.
открыть эту ссылке и загрузить ic_launcher или значок уведомления
Если вы хотите сохранить красочный значок - исправление
добавить пиксель с немного другим цветом в значок.
В моем случае есть черный значок с тени и света. При добавлении темно-синего пикселя он работает.
У меня есть аналогичная проблема на android 8.0. Попробуйте использовать белый значок ресурса. У меня есть белый квадрат, когда я пытаюсь использовать цветное изображение для значка, когда я заменяю его на белый значок, он начинает работать.
Comments