[bug修复方案分享]Android4.0以上弹出Notification时图标显示不正常

1. 现象

在Android4.0以上系统中,弹出通知栏消息时图标显示不全,如下图:

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

Normal
0

10 pt
0
2

false
false
false

EN-US
ZH-CN
X-NONE

$([{£¥·‘“〈《「『【〔〖〝﹙﹛﹝$(.[{£¥
!%),.:;>?]}¢¨°·ˇˉ―‖’”…‰′″?℃∶、。〃〉》」』】〕〗〞︶︺︾﹀﹄﹚﹜﹞!"%'),.:;?]`|}~¢

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:Cambria;}

2. 问题来源:

Android 4.0以上版本顶部导航栏StatusBar的实现类PhoneStatusBar的bug:

在com.android.systemui.SystemUIService的onCreate()中:

在此处选择实例化statusbar(手机通知栏)还是systembar(平板通知栏):

在PhoneStatusBar.start() => StatusBar.start()时调用自身的虚函数addIcon()(即调用PhoneStatusBar的addIcon()函数)中实例化顶部导航栏Icon的view(PhoneStatusBarView)的时候,利用常数设置了缩放比例,并没有根据图片的实际大小缩放。

3. 解决方案

(1)初步:反射

public Notification(Context context, int icon, CharSequence tickerText, long when, CharSequence contentTitle, CharSequence contentText, Intent contentIntent) {}中的icon既是通知栏中提示的小icon,又是通知栏下拉菜单中的大icon,通知栏提示小icon无法修改,但是通知栏下拉菜单的大icon可以在组建RemoteViews时进行修改:

先在创建Notification时设置icon为小icon,在创建RemoteViews之后反射com.android.internal.R$id的icon值,从而调用Notification的contentView.setImageViewResource(id_icon, R.drawable.icon)重置大icon。

(2)进阶:android-support-v4.jar中的NotificationCompat.Builder

NotificationCompat.Builder支持设置smallicon(通知栏提示的小icon)和largeIcon(通知栏下拉菜单中的大icon)。NotificationCompat.Builder根据SDK版本的调用不同的实现类进行兼容。

时间: 09-28