android 代码修改launcher文件修改图标,Android获取未经启动器launcher主题theme修改过的应用图标icon...

今天说的这个问题是这样的,在Android App中获取自身或其它某个包名应用的图标时,取到的Drawable并不是实际资源的图标图,而是被启动器或者主题“风格化”后的版本,比如我的一加一的CM13s系统默认主题下启动器中的应用图标会被自动P成这样:

aa73e51bf8c7bf9d1ac3344a903137d2.png

其它如MIUI等也会有类似操作,而无论你是用这样:

getPackageManager().getApplicationIcon(getApplicationInfo());

还是这样:

// Unity应用默认的图标res名叫app_icon,AS会叫ic_launcher,看下manifest中指定的资源ID串就知道了

int iconId = getResources().getIdentifier("app_icon", "drawable", getPackageName());

if (iconId>0) {

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {

dIcon = getResources().getDrawable(iconId, getTheme());

} else {

dIcon = getResources().getDrawable(iconId);

}

}

取到的都会是修改后的图标图,那么如何取得apk中的原版图标图片呢?答案在此(感谢伟大的google及stackoverflow!):

public static Drawable getApplicationIcon(Context context, String packname){

PackageManager pm = context.getPackageManager();

try {

PackageInfo pInfo = pm.getPackageInfo(packname, 0);

int resId = pInfo.applicationInfo.icon;

AssetManager assetManager = AssetManager.class.newInstance();

AssetManager.class.getMethod("addAssetPath", new Class[]{String.class}).invoke(assetManager, pInfo.applicationInfo.sourceDir);

Resources oRes = context.getResources();

Resources resources = new Resources(assetManager, oRes.getDisplayMetrics(), oRes.getConfiguration());

Drawable result = resources.getDrawable(resId);

assetManager.close();

return result;

} catch (Exception e) {

e.printStackTrace();

}

return pm.getDefaultActivityIcon();

}

此段代码在CM13s上测试通过,并能实现预期效果,其它系统版本未测试,如有问题,欢迎留言讨论!

参考文章:

文字加密小工具v3

请输入要加密的内容

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值