Android 5.0通知遇到的问题及原因
来自: http://blog.csdn.net/qq_17766199/article/details/49778339
首先是发送普通通知的一段代码。
public void send(String string) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("标题");// 设置通知栏标题 mBuilder.setSmallIcon(R.drawable.ic_launcher);// 设置通知小ICON mBuilder.setContentText(string + "点击查看。"); mBuilder.setTicker(string); // 通知首次出现在通知栏,带上升动画效果的 mBuilder.setWhen(System.currentTimeMillis());// 通知产生的时间,会在通知信息里显示,一般是系统获取到的时间 Notification notification = mBuilder.build();//API 16 NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager.notify(1, notification); }
在Android 5.0以下版本,icon可以正常显示,但是在5.0以上版本中,icon显示为白块。
随后百度这个问题找到一个网址:点击打开链接
大体意思是在5.0中,对于设计风格有了统一的要求。
引用原文:简单的说就是5.0后Android官方建议不要为通知的图标添加任何额外的透明度,渐变色,不要企图用颜色将通知图标与其他应用,比如系统应用,应用的通知图标只能是在透明的背景上有白色的图案。至于原因,文档并没有细说,只是提到5.0系统将会在底层处理图标,想知怎么处理的可以参考Android SDK API level 21后的Notificaiton源码,里面写的较详细。可以参考:点击打开链接
知道了问题的解决方法后,做了修改。如下(终极版):
public void send(String string) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, 0); mBuilder.setContentIntent(pendingIntent);// 设置通知栏点击意图 mBuilder.setContentTitle("标题");// 设置通知栏标题 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//悬挂式Notification,5.0后显示 mBuilder.setContentText(string + "点击查看。").setFullScreenIntent(pendingIntent, true); mBuilder.setCategory(NotificationCompat.CATEGORY_MESSAGE); mBuilder.setSmallIcon(R.drawable.jingbao1);// 设置通知小ICON(5.0必须采用白色透明图片) }else{ mBuilder.setSmallIcon(R.drawable.ic_launcher);// 设置通知小ICON mBuilder.setContentText(string ); } mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.jing_6));// 设置通知大ICON mBuilder.setTicker(string + "有警报!"); // 通知首次出现在通知栏,带上升动画效果的 mBuilder.setWhen(System.currentTimeMillis());// 通知产生的时间,会在通知信息里显示,一般是系统获取到的时间 mBuilder.setPriority(NotificationCompat.PRIORITY_MAX); // 设置该通知优先级 mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);//在任何情况下都显示,不受锁屏影响。 mBuilder.setAutoCancel(true);// 设置这个标志当用户单击面板就可以让通知将自动取消 mBuilder.setOngoing(false);// ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接) // 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用NotificationCompat.DEFAULT_ALL属性,可以组合 mBuilder.setVibrate(new long[] { 0, 100, 500, 100 });//振动效果需要振动权限 mBuilder.setSound(Uri.parse("android.resource://" + getPackageName()//声音 + "/" + R.raw.notification_alarm)); mBuilder.setDefaults(NotificationCompat.DEFAULT_LIGHTS);//闪灯 NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //Notification notification = mBuilder.getNotification();//API 11 Notification notification = mBuilder.build();//API 16 mNotificationManager.notify(1, notification); }
以上列举了常用的通知设置介绍。
如果你按照上面的进行了修改,结果成功,那么恭喜你!,如果你发现没有效果,那么只能说点背(我就是)。
问题出在了哪里?
其实代码方面没有任何问题,只是现在国产手机都有自己的定制化UI,在我的手上有两款手机,一款是华为的EMUI,一款是乐视的
EUI。这两个对于通知都有自己的管理,基本的管理有优先级、是否允许、是否悬浮显示通知。如下图:
所以在上面的代码中,设置通知优先级、悬浮、显示的权限(不受锁屏限制)等这些设置会无效。
这些的实现需要用户自己在设置里进行管理设置。
甚至在乐视的手机上,设置的小图,大图都会失效。最后发现乐视的EUI会对常用的app(qq,微信等)进行适配在UI中提供小图。
(例如美团在华为的显示正常,但是乐视就。。)
最后再说说小图的尺寸:
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
xxhdpi @ 24.00dp = 72.00px