Android 5.0通知遇到的问题及原因

fpsv9763 8年前

来自: 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