这个功能在华为手机上测试了,其他机型不确定是不是可以啊。核心的工具类贴出来,列表展示相关的自行编写。
public class ApkInfoManager {
private static ApkInfoManager appInfoManager;
private ApkInfoManager() {
}
public static ApkInfoManager getInstance() {
if (appInfoManager == null) {
appInfoManager = new ApkInfoManager();
}
return appInfoManager;
}
public List getAppInfoList(Context context) {
List resolveInfos = initApp(context);
ArrayList appInfoEntities = new ArrayList<>();
if (resolveInfos != null && resolveInfos.size() > 0) {
for (ResolveInfo resolveInfo : resolveInfos) {
ApkInfoEntity appInfoEntity = new ApkInfoEntity();
appInfoEntity.setAppName(resolveInfo.loadLabel(context.getPackageManager()).toString());
appInfoEntity.setIconDrawable(resolveInfo.loadIcon(context.getPackageManager()));
appInfoEntity.setPageName(resolveInfo.activityInfo.packageName);
appInfoEntity.setAppVersion(getVersion(context, resolveInfo.activityInfo.packageName));
appInfoEntity.setAppVersionCode(getVersionCode(context, resolveInfo.activityInfo.packageName));
String appDir = null;
try {
// 指定包名的程序源文件路径
appDir = context.getPackageManager().getApplicationInfo(
resolveInfo.activityInfo.packageName, 0).sourceDir;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
appInfoEntity.setApkPath(appDir);
appInfoEntities.add(appInfoEntity);
File file = new File(appDir);
if (file.exists()){
appInfoEntity.setApkSize(fileSizeFromat(file.length()).toString());
}
}
}
return appInfoEntities;
}
public List getResolveInfoList(Context context) {
List resolveInfos = initApp(context);
return resolveInfos;
}
/**
* 获取app code
* @param context
* @param pageName
* @return
*/
private long getVersionCode(Context context, String pageName) {
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
pageName, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
return packageInfo.getLongVersionCode();
} else {
return packageInfo.versionCode;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
/**
* 获取APP版本号
* @param context
* @param pageName
* @return
*/
private String getVersion(Context context, String pageName) {
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
pageName, 0);
return packageInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 初始化app列表
*/
private List initApp(final Context context) {
// 获取应用列表
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List mApps = (ArrayList) context.getPackageManager().queryIntentActivities(intent, 0);
// 排序
Collections.sort(mApps, new Comparator() {
@Override
public int compare(ResolveInfo a, ResolveInfo b) {
PackageManager pm = context.getPackageManager();
return String.CASE_INSENSITIVE_ORDER.compare(a.loadLabel(pm)
.toString(), b.loadLabel(pm).toString());
}
});
return mApps;
}
/**
* 格式化文件大小文本
* @param fileS
* @return
*/
private ApkInfoEntity.FileSizeEntity fileSizeFromat(long fileS){
DecimalFormat df = new DecimalFormat("#0.00");
ApkInfoEntity.FileSizeEntity fileSizeEntity = new ApkInfoEntity.FileSizeEntity();
String fileSizeString = "0.00";
String tagSize="MB";
if (fileS < 1024 * 1024 * 10) {
fileSizeString = df.format((double) fileS / 1048576);
tagSize = "MB";
} else if (fileS < 1024 * 1024 * 100) {
df = new DecimalFormat("#0.0");
fileSizeString = df.format((double) fileS / 1048576);
tagSize = "MB";
} else if (fileS < 1024 * 1024 * 1000) {
df = new DecimalFormat("#000");
fileSizeString = df.format((double) fileS / 1048576);
tagSize = "MB";
} else if (fileS < 1024 * 1024 * 1024 * 10L) {
df = new DecimalFormat("#0.00");
fileSizeString = df.format((double) fileS / (double) 1073741824);
tagSize = "GB";
} else if (fileS < 1024 * 1024 * 1024 * 100L) {
df = new DecimalFormat("#00.0");
fileSizeString = df.format((double) fileS / (double) 1073741824);
tagSize = "GB";
} else if (fileS < 1024 * 1024 * 1024 * 1000L) {
df = new DecimalFormat("#000");
fileSizeString = df.format((double) fileS / (double) 1073741824);
tagSize = "GB";
}
fileSizeEntity.setFileSize(fileSizeString);
fileSizeEntity.setTagSize(tagSize);
return fileSizeEntity;
}
}
public class ApkInfoEntity implements Serializable{
private String appName;
private String pageName;
private Drawable iconDrawable;
private String appVersion;
private long appVersionCode;
private String apkPath;
private String apkSize;
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getPageName() {
return pageName;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public Drawable getIconDrawable() {
return iconDrawable;
}
public void setIconDrawable(Drawable iconDrawable) {
this.iconDrawable = iconDrawable;
}
public String getAppVersion() {
return appVersion;
}
public void setAppVersion(String appVersion) {
this.appVersion = appVersion;
}
public long getAppVersionCode() {
return appVersionCode;
}
public void setAppVersionCode(long appVersionCode) {
this.appVersionCode = appVersionCode;
}
public String getApkPath() {
return apkPath;
}
public void setApkPath(String apkPath) {
this.apkPath = apkPath;
}
public String getApkSize() {
return apkSize;
}
public void setApkSize(String apkSize) {
this.apkSize = apkSize;
}
public static class FileSizeEntity implements Serializable {
private String fileSize;
private String tagSize;
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public String getTagSize() {
return tagSize;
}
public void setTagSize(String tagSize) {
this.tagSize = tagSize;
}
}
}