美文网首页gaoshijie365.tech
实战:获取已安装应用的信息

实战:获取已安装应用的信息

作者: 小狮子365 | 来源:发表于2020-04-03 11:18 被阅读0次

    背景信息

    当我们看到别人手机里有一个酷炫的软件的时候,也想安装研究研究的时候,会怎么办呢?

    我和你一样,想当然的会问一下这个应用叫什么名字,然后从应用商店里面去搜索,如果幸运的话,就会从应用商店里面给搜索出来。但是也有不幸的情况是吧?我们知道应用商店有小米、安智、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

    相关文章

      网友评论

        本文标题:实战:获取已安装应用的信息

        本文链接:https://www.haomeiwen.com/subject/exfhphtx.html