android 11 获取手机安装应用列表方案

2025-01-01  本文已影响0人  昵称_闲来扯淡

安卓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

···

⚠️但是这个配置上传到应用市场的话,不知道会不会因为隐私政策被驳回,没有上应用市场实际试过。

上一篇 下一篇

猜你喜欢

热点阅读