获取未安装apk的信息

从网上看到的方法,后来偶得灵感,精简了一下,不敢独享,与大家分享下!


/**
	 * Get Apk File Information
	 * @param context
	 * @param apkPath : apk file path
	 * @return : such as icon, name
	 */
	public static ApkInfo getApkInfo(Context context, String apkPath)
	{
		ApkInfo apkInfo = null;

		String PATH_AssetManager = "android.content.res.AssetManager";
		try
		{
			PackageManager pm = context.getPackageManager();
			PackageInfo info = pm.getPackageArchiveInfo(apkPath,
					PackageManager.GET_ACTIVITIES);
			if(null == info)
			{
				return null;
			}

			Class<?> assetMagCls = Class.forName(PATH_AssetManager);
			Constructor<?> assetMagCt = assetMagCls
					.getConstructor((Class[]) null);
			Object assetMag = assetMagCt.newInstance((Object[]) null);
			Class<?>[] typeArgs = new Class[1];
			typeArgs[0] = String.class;
			Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
					"addAssetPath", typeArgs);
			Object[] valueArgs = new Object[1];
			valueArgs[0] = apkPath;
			assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);

			Resources res = context.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();
			// XXX What we really need it is the Resources
			res = (Resources) resCt.newInstance(valueArgs);
			apkInfo = new ApkInfo();
			// Get apk name
			String name = null;
			if (info.applicationInfo.labelRes != 0)
			{
				name = res.getText(info.applicationInfo.labelRes).toString();
			}
			else
			{
				// if set name in label directly
				name = pm.getApplicationLabel(info.applicationInfo).toString();
			}
			apkInfo.setName(name);
			// Get apk icon
			if (info.applicationInfo.icon != 0)
			{
				apkInfo.setIcon(res.getDrawable(info.applicationInfo.icon));
			}

			apkInfo.setPackageName(info.packageName);
			apkInfo.setPath(apkPath);
			apkInfo.setSize(new File(apkPath).length());
			apkInfo.setVersionCode(info.versionCode);
			apkInfo.setVersionName(info.versionName);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		return apkInfo;
	}



public class ApkInfo
{
	private Drawable icon;
	private String name;
	private String packageName;
	private String versionName;
	private int versionCode;
	private String path;
	private String size;

.........
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值