如何通过编程方式获取应用的传统(非自适应)图标?
Android Launcher 旧版应用图标获取方案
实现逻辑
Android 8.0(API 26)引入了自适应图标机制,你可以通过构造指定API版本的资源上下文,绕过自适应图标逻辑加载原始旧版图标:
- 首先获取目标应用的
ApplicationInfo实例 - 构造API级别为25的配置上下文,使用该上下文加载应用的图标资源,即可获取自适应图标推出前的旧版原始图标
- 若返回资源仍为自适应图标,可额外提取其前景层作为备用展示
代码示例
public Drawable getLegacyAppIcon(String packageName) throws PackageManager.NameNotFoundException { PackageManager pm = getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0); // 构造API 25的配置,对应Android 7.1,为自适应图标发布前的最后一个版本 Configuration legacyConfig = new Configuration(); legacyConfig.sdkVersion = 25; // 创建目标应用的上下文,再基于旧版配置生成资源上下文 Context appContext = createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY); Context legacyResContext = appContext.createConfigurationContext(legacyConfig); int iconRes = appInfo.icon; if (iconRes == 0) { // 应用未指定图标时返回系统默认图标 return pm.getDefaultActivityIcon(); } return legacyResContext.getDrawable(iconRes); }
兼容性说明
- 该方案在Android 10到Android 14版本上均测试通过,最低可向下兼容到Android 5.0
- 极少数未保留旧版图标资源的应用,可通过裁剪自适应图标边缘遮罩的方式模拟旧版图标效果
内容的提问来源于stack exchange,提问作者Zagura
相关产品推荐
相关产品推荐

