网上关于"获取未安装的APK图标"的文章满天飞,但都是转帖,运行后的效果却是获取到Android的默认小机器人图标.那个暴寒....

现提供解决方法如下,废话不说,上效果图,见代码:


本方法需要使用到Java反射的知识,具体请参考:

http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html

借鉴的Android源码出处:

XXoo这个链接好长ooXX

/**  * 获取未安装的apk信息  *   * @param ctx  * @param apkPath  * @return  */ public static AppInfoData getApkFileInfo(Context ctx, String apkPath) {  System.out.println(apkPath);  File apkFile = new File(apkPath);  if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) {   System.out.println("文件路径不正确");   return null;  }  AppInfoData appInfoData;  String PATH_PackageParser = "android.content.pm.PackageParser";  String PATH_AssetManager = "android.content.res.AssetManager";  try {   //反射得到pkgParserCls对象并实例化,有参数   Class<?> pkgParserCls = Class.forName(PATH_PackageParser);   Class<?>[] typeArgs = {String.class};   Constructor<?> pkgParserCt = pkgParserCls.getConstructor(typeArgs);   Object[] valueArgs = {apkPath};   Object pkgParser = pkgParserCt.newInstance(valueArgs);      //从pkgParserCls类得到parsePackage方法   DisplayMetrics metrics = new DisplayMetrics();   metrics.setToDefaults();//这个是与显示有关的, 这边使用默认   typeArgs = new Class<?>[]{File.class,String.class,         DisplayMetrics.class,int.class};   Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(     "parsePackage", typeArgs);      valueArgs=new Object[]{new File(apkPath),apkPath,metrics,0};      //执行pkgParser_parsePackageMtd方法并返回   Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,     valueArgs);      //从返回的对象得到名为"applicationInfo"的字段对象    if (pkgParserPkg==null) {    return null;   }   Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(     "applicationInfo");      //从对象"pkgParserPkg"得到字段"appInfoFld"的值   if (appInfoFld.get(pkgParserPkg)==null) {    return null;   }   ApplicationInfo info = (ApplicationInfo) appInfoFld     .get(pkgParserPkg);         //反射得到assetMagCls对象并实例化,无参   Class<?> assetMagCls = Class.forName(PATH_AssetManager);      Object assetMag = assetMagCls.newInstance();   //从assetMagCls类得到addAssetPath方法   typeArgs = new Class[1];   typeArgs[0] = String.class;   Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(     "addAssetPath", typeArgs);   valueArgs = new Object[1];   valueArgs[0] = apkPath;   //执行assetMag_addAssetPathMtd方法   assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);         //得到Resources对象并实例化,有参数   Resources res = ctx.getResources();   typeArgs = new Class[3];   typeArgs[0] = assetMag.getClass();   typeArgs[1] = res.getDisplayMetrics().getClass();   typeArgs[2] = res.getConfiguration().getClass();   Constructor<Resources> 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);         // 读取apk文件的信息   appInfoData = new AppInfoData();   if (info!=null) {    if (info.icon != 0) {// 图片存在,则读取相关信息     Drawable icon = res.getDrawable(info.icon);// 图标     appInfoData.setAppicon(icon);     }    if (info.labelRes != 0) {     String neme = (String) res.getText(info.labelRes);// 名字     appInfoData.setAppname(neme);    }else {     String apkName=apkFile.getName();     appInfoData.setAppname(apkName.substring(0,apkName.lastIndexOf(".")));    }    String pkgName = info.packageName;// 包名       appInfoData.setApppackage(pkgName);   }else {    return null;   }      PackageManager pm = ctx.getPackageManager();   PackageInfo packageInfo = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);   if (packageInfo != null) {    appInfoData.setAppversion(packageInfo.versionName);//版本号    appInfoData.setAppversionCode(packageInfo.versionCode+"");//版本码   }   return appInfoData;  } catch (Exception e) {    e.printStackTrace();  }  return null; }

转自:http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 类和 Json对象
  3. Python list sort方法的具体使用
  4. python list.sort()根据多个关键字排序的方法实现
  5. android上一些方法的区别和用法的注意事项
  6. android实现字体闪烁动画的方法
  7. Android中dispatchDraw分析
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. Android-内存映射mmap
  2. [置顶] [Android(安卓)Studio 权威教程]Mac
  3. android 自定义View过程解析
  4. dex 转为 jar
  5. android eclipse 导入工程报错unable to
  6. Android(安卓)中Parcelable的作用 (转载)
  7. Android通信机制之Android架构(一)
  8. android异步处理Handler+Thread使用进阶
  9. Android总结(基础篇)-骚人文客
  10. Android自学笔记(4)