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

news/2025/1/19 4:57:38/

有个需求需要获取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/news/1564308.html

相关文章

python http server运行Angular 单页面路由时重定向,解决404问题

问题 当Angular在本地ng server运行时候&#xff0c;可以顺利访问各级路由。 但是运行ng build后&#xff0c;在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。 在服务器下我们第一次访问路由页面时是没有问题的&#xff0c;但是尝试刷新页面或手动输入路…

【工具】curl工具

curl 官网&#xff1a; https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注&#xff1a; 支持SMTP&#xff08;或者POP3&#xff09;协议&#xff0c;curl的版本必须高于7.20&#xff08;含&…

《初始Linux:多平台兼容的强者,无缝衔接各类设备的桥梁 》

对于新手而言&#xff0c;Linux 虽然看似神秘&#xff0c;但只要迈出第一步&#xff0c;你会发现它其实充满了乐趣和挑战。在接下来的内容中&#xff0c;我将带你一步步揭开 Linux 的神秘面纱&#xff0c;从基础概念到实际操作&#xff0c;帮助你轻松入门&#xff0c;开启属于你…

【数据库】国产达梦数据库与mysql特点、区别、发展前景

国产达梦数据库与mysql的区别 国产达梦数据库&#xff08;DM&#xff09;和 MySQL 是两种不同的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们有许多区别&#xff0c;包括特性、功能、性能、可用性、适用场景等。以下是它们之间的一些主要区别&#xff…

sparkRDD教程之必会的题目

1.前期准备 &#xff08;1&#xff09;看看上一期的博客&#xff0c;最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后&#xff0c;再来做这篇文章的任务。 上一期的博客&#xff1a;sparkRDD教程之基本命令-CSDN博客 &#xff08;2&#xff09;新建文件task6.scala …

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇&#xff0c;我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是&#xff0c;而是要对所有东西的位置做出明智的选择。相信我&#xff0c;这些东西很重要。如果你做得对&#xff0c;你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

STM32的集成开发环境STM32CubeIDE安装

STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics