问题描述
我正在使用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开始的应用程序的访问受限。