有时候我们开发中需要获取到手机中安装的所有软件相关信息,比如判断是否安装了某个软件,或者获取某个软件的具体包名等。这里我贴出相关方法。
首先我们要有一个APP的实体类
public class AppInfo {
public int uid;
public String label;
public String package_name;
public Drawable icon;
public long traffic;
public long rowid;
public int xuhao;
public int month;
public int day;
public String icon_path;
public AppInfo() {
uid = 0;
label = "";
package_name = "";
icon = null;
traffic = 0;
rowid = 0;
xuhao = 0;
month = 0;
day = 0;
icon_path = "";
}
其次我们需要一个方法
// 获取已安装的应用信息队列
public static ArrayList<AppInfo> getAppInfo(Context ctx, int type) {
ArrayList<AppInfo> appList = new ArrayList<AppInfo>();
SparseIntArray siArray = new SparseIntArray();
// 获得应用包管理器
PackageManager pm = ctx.getPackageManager();
// 获取系统中已经安装的应用列表
@SuppressLint("WrongConstant")
List<ApplicationInfo> installList = pm.getInstalledApplications(
PackageManager.PERMISSION_GRANTED);
for (int i = 0; i < installList.size(); i++) {
ApplicationInfo item = installList.get(i);
// 去掉重复的应用信息
if (siArray.indexOfKey(item.uid) >= 0) {
continue;
}
// 往siArray中添加一个应用编号,以便后续的去重校验
siArray.put(item.uid, 1);
try {
// 获取该应用的权限列表
String[] permissions = pm.getPackageInfo(item.packageName,
PackageManager.GET_PERMISSIONS).requestedPermissions;
if (permissions == null) {
continue;
}
boolean isQueryNetwork = false;
for (String permission : permissions) {
// 过滤那些具备上网权限的应用
if (permission.equals("android.permission.INTERNET")) {
isQueryNetwork = true;
break;
}
}
// 类型为0表示所有应用,为1表示只要联网应用
if (type == 0 || (type == 1 && isQueryNetwork)) {
AppInfo app = new AppInfo();
app.uid = item.uid; // 获取应用的编号
app.label = item.loadLabel(pm).toString(); // 获取应用的名称
app.package_name = item.packageName; // 获取应用的包名
app.icon = item.loadIcon(pm); // 获取应用的图标
appList.add(app);
}
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
return appList; // 返回去重后的应用包队列
}
调用该方法我们就获取到了当前手机中所有应用的一个数据了。