转: [Android]获取未装配的APK信息

转: [Android]获取未安装的APK信息

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

 

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


转: [Android]获取未装配的APK信息

 

本方法需要使用到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