【问题标题】:Using ApplicationInfo.FLAG_SYSTEM to filter out System Apps使用 ApplicationInfo.FLAG_SYSTEM 过滤掉系统应用
【发布时间】:2014-03-07 19:23:03
【问题描述】:

我使用以下代码来区分用户安装的应用程序和系统应用程序:

final PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages)
{
    if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
        Log.d(TAG, "Installed package (System) :" + packageInfo.packageName);
    else
        Log.d(TAG, "Installed package (User) :" + packageInfo.packageName);
}

这如何使某些应用程序成为用户安装的应用程序,而实际上并非如此。以下是我模拟器中的 LogCat:

Installed package (User) :com.android.smoketest
Installed package (User) :com.android.widgetpreview
Installed package (User) :com.example.android.livecubes
Installed package (User) :com.example.android.apis
Installed package (User) :com.android.gesture.builder
Installed package (User) :com.example.android.softkeyboard
Installed package (User) :com.android.smoketest.tests
Installed package (User) :faheem.start

理想情况下,用户安装的应用程序中应该只输出最后一个应用程序。

【问题讨论】:

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


    【解决方案1】:

    乌达夫·高塔姆

    我认为你的答案在多个地方都是错误的。

    1. 您在链接中站点的代码明确指出:

      /** * 与应用程序关联的标志。任意组合

    这意味着您的第三个示例(遵循 OR)完全错误,因为值 0x1001 设置了 1 位但绝对不等于 1

    1. 由于对掩码 0x1 进行 and 运算的结果始终为 0x0 或 0x1,因此 != 0 和 == 1 之间没有区别

    这表示我同意测试设置的任何位的正确方法是:

    if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多