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 解释的那样。
我正在使用 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 解释的那样。