Android 高版本如何获取App安装列表?

server/2025/1/21 4:35:48/

有个需求需要获取App内的安装列表,但是现在在高版本Android中,只能获取到一部分App效果,我获取的代码如下:

			val calendar = Calendar.getInstance()val packageManager = context.packageManagerval usageStatsManager  = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManagerval queryList = usageStatsManager.queryAndAggregateUsageStats(calendar.timeInMillis ,System.currentTimeMillis())for (entry in queryList.entries){val packageName = entry.value.packageNameif (packageManager.getLaunchIntentForPackage(packageName) != null){val applicationInfo = findPackageManager(packageManager, packageName) ?: continue// app Nameval appName = applicationInfo.loadLabel(packageManager).toString()// 获取 app iconval appIcon = BaseSystemUtils.getAppIcon(context, packageName)BLog.d("show the data : ${appName}, ${appIcon}")             }private fun findPackageManager(packageManager: PackageManager, packageName : String): ApplicationInfo? {return try {packageManager.getApplicationInfo(packageName, 0)} catch (e: Exception) {return null}}

但是只能获取到一部分App的数据,这是因为在 Android 11(API 30)及以上的版本, 由于系统隐私政策的更新,直接使用getApplicationInfo可能无法获取应用信息,那么我们可以添加 Queries 标签进行辅助查询:

首先,我们来了解一下Queries是什么东西,它是一种在Android 11以上设定的特定的包可见机制, 不需要特定的权限,就可以查看指定的App包名.

我们看一下该如何去做:
我们需要在AndroidManifest.xml 中声明我们需要查询的App, 举个例子:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="your.package.name"><!-- 不需要额外的权限声明 --><queries><!-- 声明需要查询的包名 --><package android:name="com.example.app1" /><package android:name="com.example.app2" /><!-- 或者声明需要查询的intent --><intent><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent></queries><application><!-- 应用配置 --></application>
</manifest>

有几个常用的用法:

  1. 查询特定包名:
<queries><package android:name="com.target.app" />
</queries>
  1. 查询所有浏览器:
<queries><intent><action android:name="android.intent.action.VIEW" /><data android:scheme="http" /></intent>
</queries>
  1. 查询所有启动器应用:
<queries><intent><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent>
</queries>
  1. 查询所有支持分享的应用:
<queries><intent><action android:name="android.intent.action.SEND" /><data android:mimeType="text/plain" /></intent>
</queries>
  1. 查询所有图片查看器:
<queries><intent><action android:name="android.intent.action.VIEW" /><data android:mimeType="image/*" /></intent>
</queries>

我们声明Queries之后,其它代码不需要改动,即可查询到所有的App数据, 因为这里我想查询的是所有启动器应用:

<queries><intent><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent></queries>

我们可以看到Queries是静态声明的,是我们先声明再去获取的,不能做到动态的获取,啥意思呢?
比如我们在QUeries中定义了如下:

<queries><package android:name="com.target.one.app" /><package android:name="com.target.two.app" />
</queries>

那么我们在查询数据时,只能查询包名com.target.one.appcom.target.two.appde数据, 不能查询新的com.target.three.app数据, 这个是一个比较硬的伤, 一般遇到这种情况,我们多数情况下会使用 Intent 来声明, 或者使用申请更高级别权限:android.permission.QUERY_ALL_PACKAGES, 当然了,这个需要更高的隐私权限, 不同的厂商对这个权限的敏感度不同.

最后,贴一张Android14获取全部App的效果图:
在这里插入图片描述


http://www.ppmy.cn/server/160081.html

相关文章

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

网安快速入门之Windows命令

在Windows中 我们今天介绍几个命令&#xff1a; help copy dir cd type del ipconfig net netstat tasklist sc1. help 显示命令的帮助信息。或者显示Windows内置命令。 常用参数&#xff1a; <命令>&#xff1a;查看指定命令的帮助。 示例&#xff1a;help copy 显…

Conda的一些常用命令

以下是Conda的一些常用命令&#xff1a; pip freeze > requirements.txt pip install -r requirements.txt 基本信息查看类 查看conda版本&#xff1a; conda -V 或 conda --version 可以查看当前安装的conda版本。 查看conda帮助信息&#xff1a; conda -h 或 conda --he…

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…

会话_JSP_过滤器_监听器_Ajax

第8章 会话_JSP_过滤器_监听器_Ajax 8.1 会话 8.1.1 会话管理概述 1、为什么需要会话管理 HTTP是无状态协议&#xff1a; 无状态就是不保存状态&#xff0c;即无状态协议(stateless)&#xff0c;HTTP协议自身不对请求和响应之间的通信状态进行保存&#xff0c;也就是说&…

Unix 与 Linux 深度应用与对比分析

文章目录 引言Unix 与 Linux 的相似之处1. 设计理念2. 文件系统结构3. 命令行界面4. 多用户多任务支持 Unix 与 Linux 的不同之处1. 开源性2. 内核架构3. 应用场景4. 发行版 Unix 和 Linux 的开发语言1. C 语言2. 脚本语言 在 Unix 和 Linux 上开发简单应用示例1. 编写一个简单…

瑞芯微开发板/主板Android配置APK默认开启性能模式方法

本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法&#xff0c;开启性能模式后&#xff0c;APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…