获取未安装apk图标
来源:互联网 发布:域名注册费用标准 编辑:程序博客网 时间:2024/04/28 08:11
在网上找了一圈都是以下代码,在模拟器上测试可以获取apk图标,真机上却无法显示,唉~~
public void getUninatllApkInfo(Context context, String archiveFilePath) { PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; Drawable icon = pm.getApplicationIcon(appInfo); ImageView image = (ImageView) findViewById(R.id.apk_icon); image.setVisibility(View.VISIBLE); image.setImageDrawable(icon); } }跟踪了一下主要是 PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);获取没有问题,可以得到Application的所有信息,但是再调用PackageManager获取apk图标却找不到,只返回了apk默认图标(绿色机器人),由于PackageManager是在当前应用内查找,所以查找不到。
依据网上查找的资料,利用反射机制构建一个未安装apk的Resource对象,来访问apk内的资源。
public static Resources getResources(String apkPath) throws Exception { String PATH_AssetManager = "android.content.res.AssetManager"; Class assetMagCls = Class.forName(PATH_AssetManager); Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null); Object assetMag = assetMagCt.newInstance((Object[]) null); Class[] typeArgs = new Class[1]; typeArgs[0] = String.class; Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath", typeArgs); Object[] valueArgs = new Object[1]; valueArgs[0] = apkPath; assetMag_addAssetPathMtd.invoke(assetMag, valueArgs); Resources res = getResources(); typeArgs = new Class[3]; typeArgs[0] = assetMag.getClass(); typeArgs[1] = res.getDisplayMetrics().getClass(); typeArgs[2] = res.getConfiguration().getClass(); Constructor resCt = Resources.class.getConstructor(typeArgs); valueArgs = new Object[3]; valueArgs[0] = assetMag; valueArgs[1] = res.getDisplayMetrics(); valueArgs[2] = res.getConfiguration(); res = (Resources) resCt.newInstance(valueArgs); return res; }通过PackageManager获取ApplicationInfo,利用Resource获取图标如下
public static Drawable getUninstallAPKIcon(Context context,String apkPath) { PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); Resources res = null; try {res = getResources(context,apkPath);} catch (Exception e) {return null;}if(info != null){ApplicationInfo appInfo = info.applicationInfo;return res.getDrawable(appInfo.icon); }return null; }
最近在网上找到另一种方便方式获取apk图标的方式,和大家分享一下
public Drawable loadUninstallApkIcon(Context context, String archiveFilePath) {PackageManager pm = context.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);ApplicationInfo appInfo = info.applicationInfo;appInfo.sourceDir = archiveFilePath;appInfo.publicSourceDir = archiveFilePath;return appInfo.loadIcon(pm);}
- 获取未安装apk图标
- [Android]获取未安装的APK图标
- [Android]获取未安装的APK图标
- 获取未安装的APK图标
- [Android]获取未安装的APK图标
- [Android]获取未安装的APK图标
- 获取未安装APK文件的图标
- Android获取未安装的APK图标
- 获取未安装的APK图标
- [Android]获取未安装的APK图标
- Android 获取未安装的APK图标
- 获取未安装的APK图标
- [Android]获取未安装的APK图标
- [Android]获取未安装的APK图标
- [Android]获取未安装的APK图标
- 获取未安装的APK图标
- 获取未安装的APK图标
- [Android]获取未安装的APK图标(原创非转帖)
- Struts2.2.3配置
- 4、单片机实验板的制作步骤
- 八皇后 算法改进
- 解读“买SOA架构总成本知多少”
- 程序员阿士顿的故事
- 获取未安装apk图标
- 组合,关联,聚合的区别
- 5、70秒倒计时--C51程序
- constraint用法总结 I
- AR28系列路由器配置备份
- Flex获取项目路径
- linux pthread
- 自定义的一个JS对象Cutover
- 在社会上闯荡必须要牢记的