今天需要获得已安装应用程序的信息,过滤掉已系统自带的应用程序。我在网上看了看,有人说通过
if (p.versionName == null) {
continue;
}
可以过滤掉系统自带的应用程序,我尝试了一下,不行。
查看源码,InstalledAppDetails.java应用程序的详细资料的类(比如我们进入系统的应用程序列表中,点击某个应用程序后,就会显示一个关于这个应用程序的详细列表),在这个类中,可以看到这么这个函数setAppBtnState:这个函数的功能设定详细列表中的几个按钮的值信息。
在这个函数中看到
if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
if ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
mAppButtonState = AppButtonStates.FACTORY_RESET;
mAppButtonText = getText(R.string.app_factory_reset);
} else {
if ((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) {
// Hide button if diableClearUserData is set
mAppButtonState = AppButtonStates.NONE;
visible = false;
} else {
mAppButtonState = AppButtonStates.CLEAR_DATA;
mAppButtonText = getText(R.string.clear_user_data_text);
}
}
} else {
mAppButtonState = AppButtonStates.UNINSTALL;
mAppButtonText = getText(R.string.uninstall_text);
}
上面标红的一句,if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)就是用来判断应用程序是不是系统自带的。这样就可以通过这句来过滤掉系统自带的应用程序,例子如下
List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(0);
int count = packs.size() - 1;
for (int i = 0; i <= count; i++) {
PackageInfo p = packs.get(i);
if (p.versionName == null) {
continue;
}
ApplicationInfo itemInfo = p.applicationInfo;
if ((itemInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
continue;
...............
}