簡體   English   中英

如何獲取用戶在 Android 設備上安裝的應用列表?

[英]How to get the list of apps that have been installed by a user on an Android device?

我現在正在使用以下代碼:

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

標志:

澤利米爾的回答是正確的。 但在某些情況下,它不會為您提供所有已安裝的第三方應用程序。 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 對象。 如何獲取圖標和包名等信息?

只需這樣做:

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);

為 android 11/API 30 回答這個問題

context.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA); 上述代碼返回系統應用列表,因為用戶應用默認不可見,您需要在清單中添加以下權限以獲取用戶應用列表

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

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

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

在這種情況下,我使用系統標志來排除系統應用程序,您可以在此處找到其他標志

用戶

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

Android PackageManager 類用於檢索有關當前安裝在設備上的應用程序包的信息。 您可以通過調用 getPackageManager() 獲取 PackageManager 類的實例。 PackageManager 提供了查詢和操作已安裝包和相關權限等的方法。在這個Android 示例中,我們獲取了Android 中已安裝應用程序的列表。

PackageManager packageManager = getPackageManager(); List list = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)

packageManager.getInstalledApplications() 返回設備上安裝的所有應用程序包的列表。 如果我們設置標志 GET_UNINSTALLED_PACKAGES 已設置,將返回所有應用程序的列表,包括使用 DONT_DELETE_DATA 刪除的應用程序(部分安裝的帶有數據目錄的應用程序)。

完整信息在這里。

另一個很好的閱讀在這里。

有一個非常有用的庫,叫做 AndroidUtils,它可以幫助你只寫一行代碼。

參考: https ://github.com/xihadulislam/androidUtils

val installApplications : List<ApplicationInfo> = ApplicationUtil.getInstallApplications(context)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM