您的位置:首页 > 移动开发 > Android开发

Android N 状态栏图标显示白底问题分析

2017-11-15 10:02 176 查看
  前几天客户投诉,客户的apk在我们的设备上状态栏图标不能显示应用本身的图标,而是显示为正方形的白底图片.

  首先遇到这个问题肯定是先百度一发...

  然而在网上找到的文章全市基于Android L的代码分析,已经不适用Android N,所以针对Android N状态栏变色的流程说明一下.

  Android N现在对通知还有状态栏图标的处理逻辑是:

  1.首先判断APK的target version是Android L之后,如果是则直接会主动上色

  2.如果在Android L之前则判断图片是否为Grayscale(灰度图),如果为灰度图的话也会有一个上色的操作.

  具体涉及到代码有(代码根据高通平台Android N分析)

  1.frameworks/base/core/java/android/app/Notification.java

private void processSmallIconColor(Icon smallIcon, RemoteViews contentView) {
boolean colorable = !isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon);
if (colorable) {
contentView.setDrawableParameters(R.id.icon, false, -1, resolveContrastColor(),
PorterDuff.Mode.SRC_ATOP, -1);
}
contentView.setInt(R.id.notification_header, "setOriginalIconColor",
colorable ? resolveContrastColor() : NotificationHeaderView.NO_COLOR);
}


colorable决定系统会不会主动上色,这块代码主要影响NotificationHeaderView的图标显示

  2.frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java

private void applyNotificationIconsTint() {
for (int i = 0; i < mNotificationIcons.getChildCount(); i++) {
StatusBarIconView v = (StatusBarIconView) mNotificationIcons.getChildAt(i);
boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L));
boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil);
if (colorize) {
v.setImageTintList(ColorStateList.valueOf(
StatusBarIconController.getTint(mTintArea, v, mIconTint)));
}
}
}


  这块代码主要影响状态栏的图标,知道了这两处的位置就可以Android N进行客制化设置,比如小米会提取应用的Launcher Icon来做填充
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: