如何获取用户在Android设备上安装的应用列表?

Rau*_*nak 14 android installed-applications android-package-managers android-applicationinfo

我目前正在使用以下代码:

List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
Run Code Online (Sandbox Code Playgroud)

但它会返回由设备制造商和我安装的应用程序.如何限制它以便只返回我安装的应用程序?

Zel*_*mir 36

// Flags: See below
int flags = PackageManager.GET_META_DATA | 
            PackageManager.GET_SHARED_LIBRARY_FILES |     
            PackageManager.GET_UNINSTALLED_PACKAGES;

PackageManager pm = getPackageManager();
List<ApplicationInfo> applications = pm.getInstalledApplications(flags);
for (ApplicationInfo appInfo : applications) {
    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
        // System application
    } else {
        // Installed by user
    }
}
Run Code Online (Sandbox Code Playgroud)

标志:


Nik*_*dze 10

Zelimir的回答是正确的.但在某些情况下,它不会为您提供所有已安装的第三方应用程序.ApplicationInfo也有标志FLAG_UPDATED_SYSTEM_APP设置

如果已将此应用程序安装为内置系统应用程序的更新

在我的智能手机上,这些应用程序包括Amazone Kindle,Adobe Reader,Slacker Radio等.这些应用程序未附带手机,并且是从Google Play商店安装的.因此,它们可以被视为第三方应用程序.

所以,你可能还想检查FLAG_UPDATED_SYSTEM_APP标志.

final PackageManager packageManager = _context.getPackageManager();
List<ApplicationInfo> installedApplications = 
    packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo appInfo : installedApplications)
{
    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
    {
        // IS A SYSTEM APP
    }

    if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
    {
        // APP WAS INSTALL AS AN UPDATE TO A BUILD-IN SYSTEM APP
    }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*hyn 5

如果我执行 pkgAppsList.get(0),它会返回一个 ResolveInfo 对象。如何获取图标、包名等信息?

只需这样做:

ResolveInfo info = pkgAppsList.get(0);
ApplicationInfo appInfo = info.activityInfo.applicationInfo;

PackageManager packageManager = = getPackageManager();
//And then you retrieve all needed data:
Drawable packageIcon = packageManager.getApplicationIcon(applicationInfo); //Icon
String packageName = applicationInfo.packageName; //Package name
String packageLabel = String.valueOf(packageManager.getApplicationLabel(applicationInfo)) //Package label(app name)
Run Code Online (Sandbox Code Playgroud)