我的应用会生成通知,但我没有显示为该通知设置的图标。相反,我得到一个白色方块。
我尝试调整图标的大小(尺寸720x720,66x66,44x44,22x22)。奇怪的是,当使用较小尺寸时,白色方块较小。
我已经搜索了这个问题,以及生成通知的正确方法,并且从我读过的代码应该是正确的。可悲的是,事情并非如此。
我的手机是带有Android 5.1.1的Nexus 5。模拟器,三星Galaxy s4与Android 5.0.1和摩托罗拉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);
}
答案 0 :(得分:151)
原因:对于5.0 Lollipop“通知图标必须全白”。
如果我们通过将目标SDK设置为20来解决白色图标问题,我们的应用程序 不会针对Android Lollipop,这意味着我们无法使用 棒棒糖特有的功能。
目标Sdk 21的解决方案
如果您想支持Lollipop材质图标,请为Lollipop及以上版本制作透明图标。请参考以下内容: 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)
以下Lollipop操作系统版本的Notification Builder实现将是:
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仅在Lollipop中可用,它只影响图标的背景。
它将完全解决您的问题!!
答案 1 :(得分:37)
如果您使用的是Google云消息传递,则只需更改图标即可解决此问题无法解决。例如,这不起作用:
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是透明且白色的。它也必须在Manifest元数据中定义,如下所示:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
元数据位于application
标记下,供参考。
答案 2 :(得分:21)
表示“通知图标必须完全为白色。”
答案 3 :(得分:17)
在Android Manifest中声明此代码:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
我希望这对你有用。
答案 4 :(得分:10)
我们可以这样做:
创建通知构建器的新对象,并使用通知构建器对象调用setSmallIcon()
,如下面的代码所示。
创建一种方法,我们将检查我们正在安装应用的操作系统版本。如果它低于Lolipop即API 21,那么它将采用具有背景颜色的普通应用程序图标,否则它将采用没有任何背景的透明应用程序图标。因此,使用os版本&gt; = 21的设备将使用Notification builder类的方法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;
}
答案 5 :(得分:7)
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
将此行添加到应用程序块的manifest.xml文件中
答案 6 :(得分:7)
最后,我已经找到了解决这个问题的方法。
仅当应用程序未运行时才会出现此问题。 (既不在背景中也不在前景中)。当应用在前景或背景上运行时,通知图标会正确显示。(不是白色方块)
因此,我们设置的内容与Backend API中的通知图标的配置与前端的配置相同。
在前端,我们使用了 React Native ,对于推送通知,我们使用了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
});
});
我们已使用 Node.js 作为推送通知的后端fcm-push npm package,并按如下方式设置有效负载结构。
{
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"
}
}
它基本上搜索我们的Android系统本地存储的notification_icon图像。
答案 7 :(得分:6)
我面临同样的问题我尝试了很多回答但没有得到任何解决方案,最后我找到了解决问题的方法。
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" />
答案 8 :(得分:6)
如果您想提供棒棒糖支持通知图标,请制作两个类型通知图标:
现在根据操作系统版本在运行时为通知构建器设置适当的图标:
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);
}
答案 9 :(得分:4)
通知灰度,如下所述。尽管别人写过,但它们并非黑白分明。您可能已经看到了具有多种阴影的图标,例如网络强度条。
在API 21(Lollipop 5.0)之前,颜色图标有效。您可以强制您的应用程序以API 20为目标,但这限制了应用程序可用的功能,因此不建议这样做。您可以测试正在运行的API级别并适当地设置颜色图标或灰度图标,但这可能不值得。在大多数情况下,最好使用灰度图标。
图像有四个通道,RGBA(红色/绿色/蓝色/ alpha)。对于通知图标,Android会忽略R,G和B通道。唯一重要的通道是Alpha,也称为不透明度。使用编辑器设计您的图标,使您可以控制绘图颜色的Alpha值。
Alpha值如何生成灰度图像:
使用setColor
更改
致电NotificationCompat.Builder.setColor(int argb)
。来自Notification.color
的文档:
在显示此通知时,标准样式模板应用的强调颜色(ARGB整数,如颜色中的常量)。当前模板设计通过在该颜色的字段顶上覆盖图标图像(以白色印刷)来构造彩色标题图像。 Alpha组件被忽略。
我使用setColor进行的测试显示Alpha组件不被忽略。较高的Alpha值会使像素变为白色。较低的Alpha值会将一个像素变为通知区域中的背景颜色(设备上的黑色),或者下拉通知中的指定颜色。
答案 10 :(得分:3)
解决此问题的要求:
图像格式:32位PNG(带alpha)
图片应该是透明的
透明度颜色指数:白色(FFFFFF)
来源:http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
答案 11 :(得分:3)
答案 12 :(得分:3)
(Android Studio 3.5)如果您是Android Studio的最新版本,则可以生成通知图像。 右键单击您的res文件夹 >新建>图片资产。然后,您将看到配置图像资产,如下图所示。将图标类型更改为通知图标。您的图像必须是白色和透明的。此配置图像资产将强制执行该规则。 重要提示::如果要将图标用于云/推送通知,则必须在应用程序标记下添加元数据,以使用新创建的通知图标。
<application>
...
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
答案 13 :(得分:2)
对于自定义的本地通知,在 AndroidManifest.xml 中添加以下元数据即可。
<application
android:name="xxxxxx"
android:label="xxxxxx"
android:icon="@mipmap/ic_launcher"
>
<meta-data
android:name="your_apps_bundle_id.default_notification_icon"
android:resource="@drawable/ic_notif" />
......
答案 14 :(得分:1)
对于SDK&gt; = 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();
答案 15 :(得分:1)
您可以为不同版本使用不同的图标。只需在您的图标上设置逻辑,如下所示:
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
答案 16 :(得分:1)
要减少特定于SDK的版本,只需执行以下操作:(将“#”替换为“ 0x”)
Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
答案 17 :(得分:0)
当你想要保持彩色图标 - 解决方法
在图标中添加颜色略有不同的像素。
在我的情况下,有一个带阴影和光线的黑色图标。当添加深蓝色像素时,它可以工作。
答案 18 :(得分:0)
我在Android 8.0上有类似的问题。尝试使用WHITE图标资源。当我尝试使用彩色图像作为图标时,我有白色方块,当我将其替换为白色图标时,它就开始工作了。
答案 19 :(得分:0)
我已通过添加以下代码以实现清单来解决此问题,
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/black" />
其中ic_stat_name
是在Android Studio上创建的,右键单击res >>新建>>图像资产>> IconType(通知)
我还需要在服务器php端执行另一步,其中包含通知有效负载
$message = [
"message" => [
"notification" => [
"body" => $title ,
"title" => $message
],
"token" => $token,
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
],
"data" => [
"title" => $title,
"message" => $message
]
]
];
注意该部分
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
]
其中图标名称为"icon" => "ic_stat_name"
的名称应与清单上的名称相同。
答案 20 :(得分:0)
我只是将png转换为透明png,然后图标的形状与图片相同,但颜色却不同