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

时间:2011-01-04 21:47:01

标签: android android-package-managers android-applicationinfo installed-applications

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

List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);

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

8 个答案:

答案 0 :(得分:35)

// 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
    }
}

标志:

答案 1 :(得分:9)

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
    }
}

答案 2 :(得分:3)

  

如果我执行pkgAppsList.get(0),它将返回ResolveInfo对象。如何获取图标和packageName等信息?

这样做:

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)

答案 3 :(得分:1)

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

答案 4 :(得分:1)

为Android 11 / API 30回答此问题

context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA); 上面的代码返回系统应用程序列表,因为默认情况下不显示用户应用程序,您需要在清单中添加以下权限以获取用户应用程序列表

<uses-permission android:name"android.permission.QUERY_ALL_PACKAGES">

答案 5 :(得分:1)

如果您想知道如何在 Kotlin 中执行此操作,如下所示,尽管正如 Ketan sangle 之前提到的,您需要在 AndroidManifest.xml 文件中添加 <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/>

val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)

for (packageInfo in packages) {
            if (packageInfo.flags and ApplicationInfo.FLAG_SYSTEM != 1) {
                 //enter what you want to do here
            }
        }

在这种情况下,我使用系统标志来排除系统应用程序,您可以找到其他标志 here

答案 6 :(得分:0)

用户

  1. pkgAppsList.get(i).activityInfo.packageName获取packageName
  2. pkgAppsList.get(i).activityInfo.applicationInfo.loadLabel(getPackageManager()).toString()fetch app level name

答案 7 :(得分:0)

Android PackageManager类用于检索有关当前安装在设备上的应用程序包的信息。您可以通过调用getPackageManager()来获取PackageManager类的实例。 PackageManager提供了查询和操作已安装软件包及相关权限等的方法。在这个Android示例中,我们获取了Android中安装的应用程序列表。

PackageManager packageManager = getPackageManager(); 列表list = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)

packageManager.getInstalledApplications()返回设备上安装的所有应用程序包的List。如果我们设置了标志GET_UNINSTALLED_PACKAGES,那么将返回所有应用程序的列表,包括那些用DONT_DELETE_DATA删除的应用程序(部分安装了带有数据目录的应用程序)。

完整信息here.

另一个好read here.