1

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

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

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

build.gradle 版本设置:

compileSdkVersion 30
defaultConfig {
    minSdkVersion 23
    targetSdkVersion 29
}

有谁知道这里发生了什么?

4

2 回答 2

2

您需要在清单中添加声明,以便在针对 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);

可以匹配返回。

于 2020-10-21T19:00:29.057 回答
0

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

之所以这样做,是因为从 Android 11 开始,应用程序的访问受限,正如本文所解释的那样。

于 2020-10-22T09:46:05.073 回答