android 在状态栏耳机图标显示图标显示图标显示图标,Android 通知栏图标

先来一段发送普通通知的代码。

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模拟器)

792ecf217db6

Android 4.4状态栏

792ecf217db6

Android4.4通知栏

792ecf217db6

Android5.0状态栏

792ecf217db6

Android 5.0通知栏

792ecf217db6

Android6.0状态栏

792ecf217db6

Android 6.0通知栏

792ecf217db6

Android7.0状态栏

792ecf217db6

Android7.0通知栏

分析发现

Android 通知栏分成三个不同样式

Android 5.0以下版本

792ecf217db6

Android 5.0和6.0版本

792ecf217db6

Android 7.0以上版本

792ecf217db6

发现5.0以上版本的状态图标都变成了白块,通知栏也显示异常。

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

解决方式

1、将 targetSdkVersion 修改到 21 以下,将不会这种问题。

2、分版本进行兼容

1.对于Android 5.0 以下的版本,直接可以使用原图标。

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

792ecf217db6

icon_notice_temp.png

.setSmallIcon(R.drawable.icon_notice_temp)

.setColor(Color.RED)

得到的效果为

792ecf217db6

792ecf217db6

Android6.0上的效果

792ecf217db6

Android7.0上的效果

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

792ecf217db6

不加颜色

试了一下

setLargeIcon(BitmapFactory.decodeResource(mActivity.getResources(), R.drawable.icon_notice))

得到这样的效果

792ecf217db6

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

顺带提一下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

//如果是小于5.0系统的,设置原图

notificationBuilder.setSmallIcon(R.drawable.icon_notice);

}else{

//如果是大于等于5.0系统的,设置透明图

notificationBuilder.setSmallIcon(R.drawable.icon_notice_temp);

if(Build.VERSION.SDK_INT

//如果小于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以上只设置小图标大部分系统也是能显示原图的。试验过华为,小米,魅族,三星都是能正常显示原图小图标。

随便记录,仅供参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值