PackageManager 未返回 targetSdkVersion 30 的正确包

PackageManager not returning correct packages with targetSdkVersion 30

我正在使用 PackageManager 获取用户设备上安装的所有软件包的列表。这工作得很好,直到我从 targetSdkVersion 29 切换到 30。

当我将 targetSdkVersion 从 29 增加到 30 时,PackageManager 不再返回正确的包列表(我正在制作一个启动器,事实上,它几乎不返回任何可以推出)。

我尝试了 pm.getInstalledPackages(0)pm.getInstalledApplications(0)here 中指出的检索应用程序的方法。 None 他们中有工作,而且他们之前都在工作。

build.gradle版本设置:

compileSdkVersion 30
defaultConfig {
    minSdkVersion 23
    targetSdkVersion 29
}

有人知道这里发生了什么吗?

您需要在清单中添加声明才能在定位 Android 11 (API 30) 时查看其他包:https://developer.android.com/about/versions/11/privacy/package-visibility

特别是,如果您要构建启动器,

<manifest>
  <queries>
    <intent>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent>
  </queries>
  ...
</manifest>

将允许

的所有结果
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
context.getPackageManager().queryIntentActivities(intent, 0);

可以匹配返回。

正如@ephemient 在他对他的回答的评论中指出的那样,使用 <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> 解决了它。

这样做是因为从 Android 11 开始,应用程序的访问受限,正如 this article 解释的那样。