安卓11之后使用如下代码获取手机安装应用列表无法返回完整的信息,只能获取当前APP的信息。而且这个还得添加这个权限。
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
// 获取 PackageManager 实例
val packageManager: PackageManager = packageManager
// 获取所有已安装的应用程序
val installedPackages: List<PackageInfo> = packageManager.getInstalledPackages(PackageManager.GET_META_DATA)
// 遍历所有已安装的应用
for (packageInfo in installedPackages) {
val packageName = packageInfo.packageName // 获取应用包名
val appName = packageManager.getApplicationLabel(packageInfo.applicationInfo) // 获取应用名
val versionName = packageInfo.versionName // 获取应用版本号
val versionCode = packageInfo.versionCode // 获取应用版本号(API 级别 28 及以下)
// 打印应用信息
println("Package Name: $packageName, App Name: $appName, Version Name: $versionName, Version Code: $versionCode")
}
所以使用另一种通过指定的action 配置获取安装列表:
首先在 AndroidManifest.xml 中的manifest下添加如下内容:
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>
然后通过下面代码进行获取完整的列表(包括系统软件列表)
// 创建一个包含 ACTION_MAIN 的 Intent
val intent = Intent(Intent.ACTION_MAIN)
// 使用 PackageManager 查询所有支持此 Intent 的应用
val resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)
// 遍历查询到的应用信息
for (resolveInfo in resolveInfoList) {
val appName = resolveInfo.loadLabel(packageManager).toString() // 获取应用名
val packageName = resolveInfo.activityInfo.packageName // 获取包名
println("wwwwwwww App Name: $appName, Package Name: $packageName")
}
这个代码可以用,但queryIntentActivities() 方法会有警告提示,可以修改为这个:
val resolveInfoList = packageManager.queryIntentActivities(
intent,
PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL.toLong())
)
但是这个需要在所方法上添加注解 @RequiresApi(Build.VERSION_CODES.TIRAMISU) 用于指示该方法或功能在 Android 13(API 级别 33)及以上版本 中可用。
最终获取的内容如下:
···
App Name: 位置信息, Package Name: com.android.settings
App Name: 电量与性能, Package Name: com.android.settings
App Name: 存储空间, Package Name: com.android.settings
App Name: 防打扰, Package Name: com.android.settings
App Name: 设置, Package Name: com.android.settings
App Name: 自动旋转屏幕, Package Name: com.android.settings
App Name: Button Navigation Settings, Package Name: com.android.settings
App Name: 显示与亮度, Package Name: com.android.settings
App Name: 通知日志, Package Name: com.android.settings
App Name: 通知, Package Name: com.android.settings
App Name: 应用管理, Package Name: com.android.settings
App Name: 贴身检测, Package Name: com.google.android.gms
App Name: WLAN 热点, Package Name: com.android.settings
···
⚠️但是这个配置上传到应用市场的话,不知道会不会因为隐私政策被驳回,没有上应用市场实际试过。