package com.loaderman.demo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 提供应用信息的工具类
* <p>
* 软件安装位置:
* <manifest xmlns:android="http://schemas.android.com/apk/res/android"
* android:installLocation="internalOnly"//默认只允许安装在手机内存
* >
* preferExternal: 优先sdcard, 如果sdcard已满,不存在, 就安装在手机内存
* auto: 优先手机内存
* <p>
* 软件安装流程:
* 1. 默认, 第三方软件安装时, 系统将apk拷贝到data/app目录下, 完成安装! 用户可以选择将apk移动到sdcard
* 2. 系统软件: system/app目录下
* <p>
* ROOT: 获取手机系统管理员权限, 默认手机出厂后都没有ROOT
* 一旦ROOT, 所有文件都可以随意修改, 不安全
* <p>
* 使用一键Root大师, 刷机大师, 都可以ROOT手机
*/
public class AppInfoProvider {
//获取已安装的app
public static ArrayList<AppInfo> getInstalledApps(Context ctx) {
PackageManager pm = ctx.getPackageManager();
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);//获取已安装的app
ArrayList<AppInfo> list = new ArrayList<>();
for (PackageInfo packageInfo : installedPackages) {
AppInfo info = new AppInfo();
String packageName = packageInfo.packageName;//包名
info.packageName = packageName;
ApplicationInfo applicationInfo = packageInfo.applicationInfo;//应用信息的对象
String name = applicationInfo.loadLabel(pm).toString();//应用名称
Drawable icon = applicationInfo.loadIcon(pm);//图标对象
info.name = name;
info.icon = icon;
String sourceDir = applicationInfo.sourceDir;//apk的安装路径
File file = new File(sourceDir);
long size = file.length();//文件大小
info.size = size;
//System.out.println(name);
//判断软件安装位置
//状态机
int flags = applicationInfo.flags;//标记, 可以记录当前app的一些特性
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) > 0) {
//就认为当前app具备FLAG_EXTERNAL_STORAGE特性
//安装在sdcard
info.isSdcard = true;
} else {
//安装在手机内存
info.isSdcard = false;
}
//判断软件类型, 用户?系统?
if ((flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
//就认为当前app具备FLAG_SYSTEM特性
//系统应用
info.isUserApp = false;
} else {
//用户应用
info.isUserApp = true;
}
list.add(info);
}
return list;
}
}
package com.loaderman.demo;
import android.graphics.drawable.Drawable;
/**
*应用对象
*/
public class AppInfo {
public String packageName;
public String name;
public Drawable icon;
public long size;
public boolean isSdcard;//标记是否安装在sdcard
public boolean isUserApp;//标记是否是用户应用
}