Android 通知栏图标

作者: 黑色扶手带 | 来源:发表于2018-11-30 15:42 被阅读121次
先来一段发送普通通知的代码。
NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getActivity(),CHANNEL_ID)
                        .setSmallIcon(R.drawable.icon_notice)
                        .setContentTitle("标题")
                        .setContentText("内容内容内容,内容内容内容,内容内容内容")
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
notificationManager.notify(notifiId, notificationBuilder.build());
我们来看看通知在各个版本上的表现(Genymotion模拟器)
Android 4.4状态栏
Android4.4通知栏
Android5.0状态栏
Android 5.0通知栏
Android6.0状态栏
Android 6.0通知栏
Android7.0状态栏
Android7.0通知栏
分析发现
Android 通知栏分成三个不同样式
Android 5.0以下版本
Android 5.0和6.0版本
Android 7.0以上版本
发现5.0以上版本的状态图标都变成了白块,通知栏也显示异常。

因为Android 5.0以上状态栏图标只能是白色图案,如果使用了有背景色的图片,那么会被直接填充为白色导致显示不出来。

解决方式
1、将 targetSdkVersion 修改到 21 以下,将不会这种问题。
2、分版本进行兼容

1.对于Android 5.0 以下的版本,直接可以使用原图标。
2.对于Android 5.0以上的版本。需要将通知图标修改为透明底的图片,且修改通知背景颜色。


icon_notice_temp.png
.setSmallIcon(R.drawable.icon_notice_temp)
.setColor(Color.RED)
得到的效果为 Android6.0上的效果 Android7.0上的效果

发现7.0以上通知的文字颜色也变了,这不好看,所以7.0以上判断不要设置背景颜色,得到效果就好看多了。


不加颜色

试了一下

setLargeIcon(BitmapFactory.decodeResource(mActivity.getResources(), R.drawable.icon_notice))
得到这样的效果

左下角出现了小图标,这并不是我想要的样子。

顺带提一下Android 8.0需要增加通知渠道,不然通知无法显示

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    @SuppressLint("WrongConstant")
                    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
                    channel.setDescription(description);
                    channel.setLightColor(Color.RED);
                    channel.enableVibration(true);
                    channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                    notificationManager.createNotificationChannel(channel);
                }

附上实现的关键代码

//增加一個渠道,ID不重复即可
String CHANNEL_ID = "159753";
String CHANNEL_NAME = "渠道名";
String description = "渠道说明";
int notifiId = (int) System.currentTimeMillis();
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
//Android 8.0需要增加渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        @SuppressLint("WrongConstant")
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
        channel.setDescription(description);
        channel.setLightColor(Color.RED);
        channel.enableVibration(true);
        channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getActivity(),CHANNEL_ID);
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.LOLLIPOP){
    //如果是小于5.0系统的,设置原图
    notificationBuilder.setSmallIcon(R.drawable.icon_notice);
}else{
    //如果是大于等于5.0系统的,设置透明图
    notificationBuilder.setSmallIcon(R.drawable.icon_notice_temp);
    if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N){
            //如果小于7.0系统,设置背景色
            notificationBuilder.setColor(Color.RED);
    }
}
notificationBuilder.setContentTitle("标题");
notificationBuilder.setContentText("内容内容内容,内容内容内容,内容内容内容");
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
notificationBuilder.setContentIntent(null);
notificationManager.notify(notifiId, notificationBuilder.build());
注意:这只是原生系统上的实现效果,大部分厂商都会对通知进行适配修改,5.0以上只设置小图标大部分系统也是能显示原图的。试验过华为,小米,魅族,三星都是能正常显示原图小图标。
随便记录,仅供参考

相关文章

网友评论

    本文标题:Android 通知栏图标

    本文链接:https://www.haomeiwen.com/subject/ismmdftx.html