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

更多相关文章

  1. Android 中LayoutInflater(布局加载器)源码篇之rInflate方法
  2. Android解析Intent Filter的方法
  3. android中访问本机服务器的方法
  4. Android中使用imageviewswitcher 实现图片切换轮播导航的方法
  5. Android NDK环境创建方法简介
  6. Unity3D和Android之间的方法交互(jar模式)

随机推荐

  1. Android(安卓)O新特性系列
  2. Android与JavaScript方法相互调用
  3. 获取PCM音频数据的声音分贝值
  4. Android的源代码结构
  5. sencha touch 调用android主函数里的方法
  6. Android开机自启动后台服务-RECEIVE_BOOT
  7. Android横竖屏切换方法
  8. Android如何反编译与再编译
  9. listview为空时,显示字符串
  10. Android(安卓)CTS(兼容性测试)整个流程