public ApplicationRet.Application getApkFileInfo(Context ctx, String apkPath) {File apkFile = new File(apkPath);if (!apkFile.exists() || !apkPath.toLowerCase().endsWith(".apk")) {return null;}ApplicationRet.Application 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);PackageManager pm = ctx.getPackageManager();// 读取apk文件的信息appInfoData = new ApplicationRet.Application();if (info != null) {if (info.icon != 0) {// 图片存在,则读取相关信息Drawable icon = res.getDrawable(info.icon);// 图标appInfoData.setLocalAppIcon(icon);}if (info.labelRes != 0) {String name = (String) res.getText(info.labelRes);// 名字appInfoData.setTitle(name);} else {String loadLabelName = info.loadLabel(pm).toString();if(loadLabelName == null || "".equals(loadLabelName)) {String apkName = apkFile.getName();appInfoData.setTitle(apkName.substring(0,apkName.lastIndexOf(".")));} else {appInfoData.setTitle(loadLabelName);}}String pkgName = info.packageName;// 包名appInfoData.setPkg(pkgName);} else {return null;}PackageInfo packageInfo = pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);if (packageInfo != null) {appInfoData.setVersionName(packageInfo.versionName);appInfoData.setVersion(packageInfo.versionCode);// 版本码}appInfoData.setIsAppFlag(ActionController.manager_download_app_flag_downloaded);return appInfoData;} catch (Exception e) {e.printStackTrace();}return null;}



if (info.labelRes != 0) {String name = (String) res.getText(info.labelRes);// 名字appInfoData.setTitle(name);} else {String loadLabelName = info.loadLabel(pm).toString();if(loadLabelName == null || "".equals(loadLabelName)) {String apkName = apkFile.getName();appInfoData.setTitle(apkName.substring(0,apkName.lastIndexOf(".")));} else {appInfoData.setTitle(loadLabelName);}}注意红色标注部分,在取apk应用程序名的时候,采用 info.labelRes方法 有可能取不到,原因是开发者没有将应用程序的应用名写到String.xml中,而是直接写到了AndroidManifest.xml中的label标签中,如:android:label="包名", 这样用info.labelRes就获取不到,只能用info.loadLabel()方法。

更多相关文章

  1. Android之访问下载文件
  2. android 4.0 屏蔽home键实现
  3. Android(安卓)EditText中添加图标的简单方法
  4. Android(安卓)将View转换成Bitmap
  5. 转 Android地图和定位学习总结
  6. android抓取各种log的方法
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. 类和 Json对象
  9. Python list sort方法的具体使用

随机推荐

  1. android中网络操作使用总结(http)
  2. android模拟打电话的应用小程序
  3. android 环境安装、helloworld demo 创建
  4. Android新手入门 FAQ
  5. Android学习札记13:为什么更推荐使用Parce
  6. 在 Android(安卓)上使用协程(三) :Real Work
  7. Android网络游戏之神农诀项目开发--视频
  8. 《Android和PHP开发最佳实践》迷你书
  9. Android(安卓)Java 网络 OS等笔试题 --
  10. Android(安卓)NDK入门实例 计算斐波那契