从网上看到的方法,后来偶得灵感,精简了一下,不敢独享,与大家分享下!
/**
* 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;
.........
}