我有一个显示自定义通知的应用程序。问题在于,在Android 5中运行时,通知栏中的小图标显示为白色。我怎样才能解决这个问题?
我有一个显示自定义通知的应用程序。问题在于,在Android 5中运行时,通知栏中的小图标显示为白色。我怎样才能解决这个问题?
Answers:
接受的答案不正确(完全)。当然,它使通知图标显示为彩色,但是这样做有一个很大的缺点-通过将目标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
我写这个答案。
为此,您必须将icon设为,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
参见Google Developer Console通知指南。
首选通知图标大小为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(使用尺寸方法“调整大小”而不是“重新采样”,否则图片再次增加到每个像素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()
如丹尼尔·赛义迪以上建议。
另一个选择是利用特定于版本的drawable(mipmap)目录为Lollipop及更高版本提供不同的图形。
在我的应用中,“ v21”目录包含带有透明文本的图标,而其他目录包含非透明版本(适用于Lollipop之前的Android版本)。
应该看起来像这样:
这样,您无需检查代码中的版本号,例如
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);
同样,如果您使用“ icon”属性,则可以在GCM有效负载中引用“ ic_notification”(或任何您选择调用的名称)。
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版本的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());
}
错误的图示
右边的图标
alpha通道是Android用于通知图标的唯一图像数据:
alpha == 1
:像素显示白色alpha == 0
:像素显示为您在处选择的颜色 Notification.Builder#setColor(int)
在https://developer.android.com/about/versions/android-5.0-changes.html中提到了这一点:
系统将忽略操作图标和主通知图标中的所有非Alpha通道。您应该假定这些图标将仅是Alpha。
几乎所有内置可绘制对象似乎都是适合此操作的Alpha图像,因此您可以使用以下方法:
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(红色/绿色/蓝色/ alpha)。对于通知图标,Android会忽略R,G和B通道。唯一重要的渠道是Alpha,也称为不透明度。使用编辑器设计图标,该编辑器可让您控制绘图颜色的Alpha值。
Alpha值如何生成灰度图像:
用以下方法进行更改setColor
:
致电NotificationCompat.Builder.setColor(int argb)
。从以下文档中Notification.color
:
呈现此通知时,标准样式模板要应用的重音颜色(ARGB整数,如Color中的常量)。当前的模板设计通过将图标图像(以白色模版)覆盖在此颜色的字段上方来构造彩色标题图像。Alpha组件将被忽略。
我对setColor的测试表明,不忽略Alpha组件;相反,它们仍然提供灰度。较高的Alpha值会使像素变白。较低的Alpha值会将像素变为通知区域中的背景颜色(在我的设备上为黑色),或在下拉通知中变为指定的颜色。(似乎其他人报告的行为略有不同,因此请注意!)
android后的Lollipop版本android更改了在通知栏中显示通知图标的准则。官方文档说:“更新或删除涉及颜色的资产。系统会忽略操作图标和主通知图标中的所有非Alpha通道。您应假定这些图标仅是Alpha。系统以白色绘制通知图标和动作图标为深灰色。” 现在,用通俗易懂的术语来说,这意味着“将您不想显示的图像的所有部分转换为透明像素。所有颜色和非透明像素均以白色显示”
您可以在此处查看如何使用屏幕快照详细执行此操作 :https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
希望有帮助
如果您使用的是GoogleFireBaseMessaging,则可以在“通知”有效负载中设置“图标ID”(这有助于我解决白条图标问题):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
将R.drawable中的ic_notification设置为您自己的ID。
我在这个问题上也遇到了太多问题,但是在互联网上搜索之后,我找到了针对此问题的不同解决方案。让我总结所有解决方案并解释一下:
注意:此解决方案适用于Phonegap cordova用户
<preference name="android-targetSdkVersion" value="20"/>
您需要将android-targetSdkVersion值设置为小于21。因此,在设置此值后,通知图标图像将显示到Android 6(棉花糖),直到在Android 7(牛轧糖)中都无法使用。这个解决方案对我有用。
<preference name="StatusBarStyle" value="lightcontent" />
但是,仅当您的应用程序打开时,此解决方案才有效。因此,我想这个解决方案不是最好的解决方案,但是它对许多用户有效。
而且我相信上述解决方案之一将可以解决您的问题。
根据文档,自Android 3.0(API级别11)起,通知图标必须为白色:
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
“状态栏图标仅由透明背景上的白色像素组成,并在适当的情况下使用alpha混合以实现平滑的边缘和内部纹理。”
在应用程序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
。