实战:获取已安装应用的信息
2020-04-03 本文已影响0人
小狮子365
背景信息
当我们看到别人手机里有一个酷炫的软件的时候,也想安装研究研究的时候,会怎么办呢?
我和你一样,想当然的会问一下这个应用叫什么名字,然后从应用商店里面去搜索,如果幸运的话,就会从应用商店里面给搜索出来。但是也有不幸的情况是吧?我们知道应用商店有小米、安智、360、应用宝等等非常的多,并不是每个 APP 都会上传到所有的应用商店,所以我们从自己应用商店里搜索对应的 APP 失败的可能性还是有的,尤其是小众一点的 APP。那这时候我们会怎么办呢?
既然从应用商店搜不到,那就直接网页搜索吧,从官网或者是其他网站搜索到后下载,然后传到手机上进行安装。但是这个流程好麻烦啊,还得搜索,从搜索结果中筛选出那个靠谱的下载地址,下载,传到手机安装。
通过这两个方法我们总能下载安装这个酷炫的 APP。但是针对应用商店找不到,又不得不去网页搜索的情况有没有更便捷的方法呢?比如让别人直接把安装包发给自己,省下检索的时间多好啊。别说,还真有办法,且听我细细道来哈。
效果图-展示获取到的信息问题分析
问题的关键在于获取到已安装应用的信息,然后从这些信息中找到对应的安装包文件,找到文件后怎么发送就看大家的喜好了~
获取已安装应用的信息,关键在于两个类:
-
PackageInfo
:这个类收集的是AndroidManifest.xml
文件中的所有信息。 -
ApplicationInfo
:这个类收集的是AndroidManifest.xml
中<application>
标签中的所有信息。
接下来就来看看如何实现吧。
代码实现
首先我们来定义一个类来包装我们想要获取的信息。
data class InstalledAppInfo(
val packageName: String, // 包名
val versionCode: Int, // 版本号
val versionName: String, // 版本名
val firstInstallTime: Long, // 首次安装时间
val lastUpdateTime: Long, // 最近一次更新时间
val sourceDir: String, // APK 文件位置
val label: String, // 应用名
val icon: Drawable, // 应用图标
val systemApp: Boolean // 系统 APP
)
核心代码很少,就一个方法而已。
fun Context.installedAppInfoList(): List<InstalledAppInfo> {
val installedAppInfoList = mutableListOf<InstalledAppInfo>()
val packageInfoList = packageManager.getInstalledPackages(0)
packageInfoList.forEach {
it.apply {
val installedAppInfo = InstalledAppInfo(
packageName = packageName,
versionCode = versionCode,
versionName = versionName,
firstInstallTime = firstInstallTime,
lastUpdateTime = lastUpdateTime,
sourceDir = applicationInfo.sourceDir,
label = packageManager.getApplicationLabel(it.applicationInfo).toString(),
icon = packageManager.getApplicationIcon(it.applicationInfo),
systemApp = !applicationInfo.sourceDir.contains("/data/app/"))
installedAppInfoList.add(installedAppInfo)
}
}
return installedAppInfoList
}
这里有几点需要注意:
- 这个方法比较耗时,所以在自己使用的过程中不要放在主线程中。
- 系统应用的判断是通过 APK 文件的目录进行的。试过使用
ApplicationInfo#flags
来判断,结果不行。
至此,我们的核心工作已经完成了,至于获取到这些信息之后怎么去用那就发挥各自的创造性吧。啊哈哈哈哈~
总结
整体来说这个案例不难,但是的确实用啊。这里我给定义成了 Context
的扩展方法,可以放在自己的工具库中,这样就可以避免写重复的代码了。
最后提一句,这个案例源码地址:https://github.com/gaoshijie365/Case-InstalledAppInfo