我用以下一段代码的时刻:

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

但它返回的应用程序已经安装的设备制造商和我。如何对其加以限制,以便只应用程序,我们返回?

有帮助吗?

解决方案

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

标志:

其他提示

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

如果我做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)

尼古拉的答案是正确的,但可以使用迭代器进行优化。这就是我想到的:

/**
 * Return list of installed user applications
 */
static List<ApplicationInfo> getUserInstalledApplications(Context context) {
    // Get installed applications
    final PackageManager packageManager = context.getPackageManager();
    List<ApplicationInfo> installedApplications =
            packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

    // Remove system apps
    Iterator<ApplicationInfo> it = installedApplications.iterator();
    while (it.hasNext()) {
        ApplicationInfo appInfo = it.next();
        if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
            it.remove();
        }
    }

    // Return installed applications
    return installedApplications;
}
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

用户

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

安卓PackageManager类是用于检索信息上应用程序包目前已安装在设备上。你可以得到的一个实例PackageManager类通过调getPackageManager().PackageManager提供方法,用于查询和操纵安装软件包和有关的权限,等等。在这个机器如,我们获得名单的安装应用程序。

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

packageManager.getInstalledApplications()返回的一个列表中的所有应用程序包,安装在设备上。如果我们设置标志GET_UNINSTALLED_PACKAGES已经设置,列表中的所有应用程序,包括那些被删除与DONT_DELETE_DATA(部分地安装应用程序与数据目录)将返回。

完整的信息 在这里。

另一个好 在这里阅读。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top