PackageManager没有返回带有targetSdkVersion 30的正确软件包

问题描述

我正在使用PackageManager来获取用户设备上安装的所有软件包的列表。一切正常,直到我从targetSdkVersion 29切换到30。

当我将targetSdkVersion从29增加到30时,PackageManager不再返回正确的软件包列表(我正在创建启动器,实际上,它几乎不返回任何可以启动的软件包)

我尝试了pm.getInstalledPackages(0)pm.getInstalledApplications(0)以及here所示的检索应用程序的方法。他们都没有工作,而且以​​前都在工作。

build.gradle版本设置:

compileSdkVersion 30
defaultConfig {
    minSdkVersion 23
    targetSdkVersion 29
}

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

解决方法

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

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

  for a in list:
        answer_or_help = False
        print(a.question)
        while answer_or_help not in ("q","a"):
                answer_or_help = input("Press a for Answer,h for Help,q to quit: ")
                if answer_or_help == "h":
                        print(a.hint)
                elif answer_or_help == "a":
                        print(a.answer)
                elif answer_or_help != "q":
                        print("This is not a valid answer")
        else:
                if answer_or_help == "q":
                        break

将允许所有符合以下条件的结果

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

可以匹配返回。

,

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

之所以这样做,是因为this article很好地解释了从Android 11开始的应用程序的访问受限。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...