前言

目前正是Android 11 马上要发布的时期,当前在Android手机上获取应用安装列表,要从三个维度上区分:获取方法、系统版本、是否系统应用。

  • 获取方法:至少有两种方法,它们的行为结果会有所差异
  • 系统版本:从 Android 11 开始,应用列表的获取将受到限制
  • 是否系统应用:系统应用与非系统应用的获取结果,也不尽相同

获取方法介绍

获取所有应用列表(系统应用+非系统应用),常用的方法有2种:Shell命令行、系统API。

而要进一步区分是否系统应用,只要对上述结果进行一次过滤即可。下面分别介绍:

1.shell命令行

pm list packages

示例代码:

private List<String> getPkgList() {List<String> packages = new ArrayList<String>();try {Process p = Runtime.getRuntime().exec("pm list packages");InputStreamReader isr = new InputStreamReader(p.getInputStream(), "utf-8");BufferedReader br = new BufferedReader(isr);String line = br.readLine();while (line != null) {line = line.trim();if (line.length() > 8) {String prefix = line.substring(0, 8);if (prefix.equalsIgnoreCase("package:")) {line = line.substring(8).trim();if (!TextUtils.isEmpty(line)) {packages.add(line);}}}line = br.readLine();}br.close();p.destroy();} catch (Throwable t) {t.printStacktraces();}return packages;
}

2.系统API

PackageManager.getInstalledPackages()

示例代码:

private List<String> getPkgListNew() {List<String> packages = new ArrayList<String>();try {List<PackageInfo> packageInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES |PackageManager.GET_SERVICES);for (PackageInfo info : packageInfos) {String pkg = info.packageName;packages.add(pkg);}} catch (Throwable t) {t.printStackTrace();;}return packages;
}

判断是否系统应用

// 通过packName得到PackageInfo,作为参数传入即可
private boolean isSystemApp(PackageInfo pi) {boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1;boolean isSysUpd = (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1;return isSysApp || isSysUpd;
}

总结对比

  • 测试机:Google Pixel 3 XL
  • 系统应用:262个
  • 非系统应用:2个(包括测试demo)
获取方法 系统应用 非系统应用
< Android 11 >= Android 11 < Android 11 >= Android 11
shell命令 - 可用- 不需要权限 - 条件可用- 无权限:结果变少(99个)- 有权限:得到所有应用(262个) - 可用- 不需要权限 - 条件可用- 无权限:只能得到自己(1个)- 有权限:得到所有应用(2个)
系统API - 可用- 不需要权限 - 条件可用- 无权限:结果变少(99个)- 有权限:得到所有应用(262个) - 可用- 不需要权限 - 条件可用- 无权限:只能得到自己(1个)- 有权限:得到所有应用(2个)

说明:

  • 这里说的权限是:QUERY_ALL_PACKAGES,Android 11 新增权限,不用动态申请
  • 这里说的 >= Android 11 是:targetSdkVersion 为 Android 11 且 运行在11的设备上

补充:广播监听应用安装/卸载的行为变化

如果使用了广播,监听应用安装与卸载动作,那么在 Android 11 上也有一些行为变化。

概括来讲,就是 Android 11 下,若无 QUERY_ALL_PACKAGES 权限,则无法监听到 安装 动作

Android 11 之前
  • 能监听到 安装/卸载
Android 11 开始
  • 若无 QUERY_ALL_PACKAGES 权限:只能监听到 卸载
  • 若有 QUERY_ALL_PACKAGES 权限:仍能监听到 安装/卸载

Android 获取应用列表相关推荐

  1. android+获取相册列表,android 获取相册列表的实现(二)

    该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可 该项目实现的功能如下: 获取手机相册,点击每个相 ...

  2. android wifi动画显示,Android获取WiFi列表的正确用法

    最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...

  3. android传感器 列表,android获取传感器列表

    本文介绍如何获取android设备所支持的传感器列表. 目前,android 4.4 (API等级19)支持以下传感器: TYPE_ACCELEROMETER 加速度传感器,单位是m/s2,测量应用于 ...

  4. android 分页列表,android获取相册列表并分页获取

    有时候需要获取到系统所有图片,但一次性获取太多了,需要分批分页获取,网上很多资料都没有说到分页,作为一个数据库达人,怎么能受此折磨,因此尝试出来了以下方案: /** * 从本地获取相册列表 * @pa ...

  5. android+获取相册列表,android 获取相册列表的实现(一)

    该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能. 该项目最大特色: 1 ...

  6. Android 获取蓝牙列表,连接并发送数据

    今天分享一个获取蓝牙列表,连接并传输数据的功能 class BlueToothActivity : BaseActivity(), ICBlueTooth.IVBlueTooth{override v ...

  7. android 获取应用列表,获取全部应用列表

    有时需对已安装的应用进行管理 , 这里我简单的写了获取应用程序列表. 代码如下: package com.lml.applicationtest; import java.util.List; imp ...

  8. android 获取lanucher 列表

    引用:http://www.iteye.com/topic/696187 获取Launcher 启动列表 即 列出所有Launcher程序 通过PackageManager 来获取 [代码 步骤] 1 ...

  9. Android 获取Wifi列表详解(包含动态权限申请)

    WLAN 扫描流程 扫描流程分为三步: 为 SCAN_RESULTS_AVAILABLE_ACTION 注册一个广播监听器,系统会在完成扫描请求时调用此监听器,提供其成功/失败状态.对于搭载 Andr ...

最新文章

  1. ARM32页表-虚拟地址到物理地址的转换
  2. 硬链接、软链接和inode
  3. mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  4. 想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么
  5. vs2012里用easyUI,显示不正常
  6. BZOJ 2653 middle
  7. 零基础转行web前端,如何高效的去学习web前端?
  8. 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
  9. Scp远程批量执行命令
  10. python自动化办公入门书籍-Python自动化办公实战教程2020最新带源码
  11. 购物车的简单添加与计算
  12. R-CNN学习笔记3:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPP-net)
  13. 线性代数 : 方程组的几何解释
  14. html5 blob video 下载
  15. 房屋租赁管理系统(Java源码+论文)
  16. 【Python】 标准差计算(std)
  17. centos 日志审计_CentOS7下安全审计工具Auditd的简单使用
  18. Nico的刷题日记(一)
  19. lt19264a+c语言程序,可以直接显示汉字的19264液晶驱动C语言程序
  20. java二面烩面什么问题_小米Java面试题,一面二面面经分享

热门文章

  1. window xp 自动登陆系统
  2. php 图片相似度对比算法,php比较图片相似度代码示例
  3. Ax=0的非零解/马尔可夫链的平稳分布
  4. 智能网联封闭测试场和开放道路测试政策情况全扫描(2022版)
  5. 《区块链跨链技术进展研究》论文笔记
  6. 根据某一字段值相同合并字符串
  7. Python自动生成ffmpeg转码HEVC (X265,H265) 命令
  8. mib browser读取飞塔mib文件的oid
  9. office 365 A1 Plus账号注册
  10. Java_多线程、并发控制、分布式锁、存储结构、消息队列常见问题