Android PackageManager未返回targetSdkVersion 30的正确软件包
我正在使用Android PackageManager未返回targetSdkVersion 30的正确软件包,android,build.gradle,android-package-managers,target-sdk,Android,Build.gradle,Android Package Managers,Target Sdk,我正在使用PackageManager获取用户设备上安装的所有软件包的列表。在我从targetSdkVersion 29切换到30之前,它工作得非常好 当我将targetSdkVersion从29增加到30时,PackageManager不再返回正确的包列表(我正在制作一个启动器,事实上,它几乎不返回任何可以启动的包) 我尝试了pm.getInstalledPackages(0),pm.getInstalledApplications(0)以及检索应用程序的方法,如图所示。他们没有一个人工作,而
PackageManager
获取用户设备上安装的所有软件包的列表。在我从targetSdkVersion 29切换到30之前,它工作得非常好
当我将targetSdkVersion从29增加到30时,PackageManager
不再返回正确的包列表(我正在制作一个启动器,事实上,它几乎不返回任何可以启动的包)
我尝试了pm.getInstalledPackages(0)
,pm.getInstalledApplications(0)
以及检索应用程序的方法,如图所示。他们没有一个人工作,而且所有人以前都在工作
build.gradle版本设置:
compileSdkVersion 30
defaultConfig {
minSdkVersion 23
targetSdkVersion 29
}
有人知道这里发生了什么吗?您需要在清单中添加声明,以便在针对Android 11(API 30)时查看其他软件包: 特别是,如果你正在建造一个发射器
...
将允许所有
Intent-Intent=新意图(Intent.ACTION\u MAIN,空);
intent.addCategory(intent.CATEGORY_启动器);
context.getPackageManager().QueryInputActivities(intent,0);
可以将匹配项返回。正如@ephemient在他对答案的评论中指出的那样,使用解决了它
之所以这样做,是因为Android 11之后的限制访问应用程序,这也解释了这一点。如果您需要
pm.getInstalled*()
的结果,也会有限制访问应用程序。但是意图查询应该是启动器实际需要的。我实际上已经在清单中设置了这些声明,但是你关于使用权限的评论是我的解决方案。有了这个许可,它又能正常工作了!谢谢!