当前位置: 代码迷 >> Android >> 转: [Android]获取未装配的APK信息
  详细解决方案

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

热度:16   发布时间:2016-05-01 18:31:54.0
转: [Android]获取未安装的APK信息

网上关于"获取未安装的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

  相关解决方案