android原生launcher3替换apk桌面图标

本文介绍如何在Android 8.1中针对Launcher3去除Chrome应用图标周围的白边,通过修改Launcher3源码和替换图标资源实现风格统一。主要涉及IconCache.java和LauncherIcons.java的调整,以及使用阿里巴巴矢量图标库获取新图标。
摘要由CSDN通过智能技术生成

Android 8.1 去掉 Launcher3 默认给 icon 增加的白边
android的新特性,目前定制后已将此功能关闭,但是chrome始终有白色的一圈,定位在chrome apk自己的android:icon资源就是如此,由此引发出与其他的apk图标风格不一致,看起来别扭,就想从launcher替换一下。

参考:
Android P 上Launcher3 中实现两种方式替换桌面图标

由于安装和预置在显示桌面图标的代码不同,所以通过trace代码,找到了公共必走的路径:

packages/apps/Launcher3/src/com/android/launcher3/graphics/LauncherIcons.java
	/**
     * Returns a bitmap suitable for the all apps view. The icon is badged for {@param user}.
     * The bitmap is also visually normalized with other icons.
     */
    public static Bitmap createBadgedIconBitmap(
            Drawable icon, UserHandle user, Context context, int iconAppTargetSdk) {
	...
	}

然后定位到拿图的地方:

packages/apps/Launcher3/src/com/android/launcher3/IconCache.java
	public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) {
        return mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
    }

由此根据参考链接开始深度定制:

Index: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
===================================================================
无法显示: 文件标记为二进制类型。
svn:mime-type = application/octet-stream
Index: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
===================================================================
--- packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png	(版本 0)
+++ packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png	(工作副本)

 属性改变: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
___________________________________________________________________
Index: packages/apps/Launcher3/src/com/android/launcher3/IconCache.java
===================================================================
--- packages/apps/Launcher3/src/com/android/launcher3/IconCache.java	(版本 1588)
+++ packages/apps/Launcher3/src/com/android/launcher3/IconCache.java	(工作副本)
@@ -176,9 +176,23 @@
     }
 
     public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) {
+		int resId = getReplaceIconResByPackageName(info);
+		if (resId != 0) {
+			return mContext.getDrawable(resId);
+		}
         return mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
     }
 
+	private int getReplaceIconResByPackageName(LauncherActivityInfo info) {
+		String iconName = info.getComponentName().getPackageName().toLowerCase().replace(".", "_");
+		int identifier = mContext.getResources().getIdentifier(iconName, "mipmap", mContext.getPackageName());
+		return identifier;
+	}
+
     protected Bitmap makeDefaultIcon(UserHandle user) {
         Drawable unbadged = getFullResDefaultActivityIcon();
         return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext, Build.VERSION_CODES.O);

patch中的资源文件com_android_chrome.png是通过阿里巴巴矢量图标库获取的。
另外需要特别注意的是,资源的格式:
我本想直接用包名com.xxx.xxx将资源放在mipmap文件夹下,通过getIdentifier获取资源号,但是始终是0,尝试将“.”换成“_”就OK了。
Android开发之——使用getIdentifier()方法根据资源名来获取资源id
代码就需要加上toLowerCase().replace(".", "_")即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值