数据抓取(三):安卓-免权限获取所有安装的应用程序信息(系统和非系统)

系列文章目录

总篇:数据抓取:抓取手机设备各种数据

分篇(一):【数据抓取(一)】手机通讯录数据获取

分篇(二):数据抓取(二)&定位方案:地址信息的获取


前言

在获取用户数据时,有时候我们需要获取用户的应用列表,比如在开发清理工具应用或者开发借贷应用,查询用户是否为老赖等时,那么我们完全可以利用PackageManager来获取应用列表。


效果展示:

一、应用列表bean类

主要属性有:

字段名 描述
app_name APP名称
app_type 是否系统app 0:非系统app 1:系统app
app_version APP版本
in_time 安装时间(毫秒)
obtain_time 数据抓取时间(秒)
package_name 包名
up_time 更新时间 (毫秒)
version_code 版本号

二、获取步骤

1.获取全局包数据

直接通过上下文获取即可:

java 复制代码
  `PackageManager packageManager = context.getPackageManager();`

2.获取当前用户安装应用列表:ApplicationInfo

该对象拥有全部应用程序最重要的包名packageName,我们需要通过包名找到对应的程序信息。

java 复制代码
List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

3.解析应用对象信息 PackageInfo

PackageInfo对象代表每个应用程序的包信息,我们只需要获取该对象的属性就可以达到我们想要获取应用信息的需求,我们需要先通过PackageManager对象通过包名来获取每个应用程序的信息PackageInfo。

java 复制代码
// 参数:包名;用于修改返回数据的附加选项标志
 PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_ACTIVITIES);

之后通过解析PackageInfo 对象属性就能获取我们需要的信息,以下为部分属性解释:

属性名 描述
versionName 版本号
firstInstallTime 安装时间
lastUpdateTime 更新时间
packageName 包名
versionCode 版本号,但目前已被getLongVersionCode()方法替代

我们只需要通过一个循环获取数据便可以得到我们想要的信息,以下为代码

java 复制代码
                appListBeans.add(new AppListBean(name,
                            // 判断是否系统应用
                            String.valueOf((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ? 1 : 0), packageInfo.versionName,
                            String.valueOf(packageInfo.firstInstallTime),
                            (int) (new Date().getTime() / 1000), packageInfo.packageName,
                            String.valueOf(packageInfo.lastUpdateTime), String.valueOf(packageInfo.getLongVersionCode())));

三、获取非系统app

仅仅按上述描述来获取应用程序只能够获取系统应用程序,但是这是远远不够的,我们如果想获取非系统应用程序需要在清单AndroidManifest.xml里添加如下代码

xml 复制代码
    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />

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

四、完整工具类

java 复制代码
package com.itaem.datacapture.Utils;// 2023/8/13


import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.Attribution;
import android.content.pm.ConfigurationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.pm.ServiceInfo;
import android.os.Build;

import com.itaem.datacapture.bean.AppListBean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

// 作者:ITAEM chen
public class AppListUtil {
    /**
     * 获取列表
     */
    public static List<AppListBean> getAppListBean(Context context) {
        List<AppListBean> appListBeans = new ArrayList<>();
        PackageManager packageManager = context.getPackageManager();
        List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
        for (ApplicationInfo applicationInfo : installedApplications) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_ACTIVITIES);
                // 获取app名称
                String name = packageInfo.applicationInfo.loadLabel(packageManager).toString();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                    appListBeans.add(new AppListBean(name,
                            // 判断是否系统应用
                            String.valueOf((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ? 1 : 0), packageInfo.versionName,
                            String.valueOf(packageInfo.firstInstallTime),
                            (int) (new Date().getTime() / 1000), packageInfo.packageName,
                            String.valueOf(packageInfo.lastUpdateTime), String.valueOf(packageInfo.getLongVersionCode())));
                }else {
                    appListBeans.add(new AppListBean(name,
                            // 判断是否系统应用
                            String.valueOf((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ? 1 : 0), packageInfo.versionName,
                            String.valueOf(packageInfo.firstInstallTime),
                            (int) (new Date().getTime() / 1000), packageInfo.packageName,
                            String.valueOf(packageInfo.lastUpdateTime), String.valueOf(packageInfo.versionCode)));
                }
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        return appListBeans;
    }
}

调用方法:(防止数据太多导致ANR,强烈建议在子线程获取)

java 复制代码
            new Thread(new Runnable() {
                    @Override
                    public void run() {
                        List<AppListBean> appListBean = AppListUtil.getAppListBean(DataListShowActivity.this);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                table.setData(appListBean);
                            }
                        });
                    }
                }).start();

最后附上相关源码以及我手搓的开源库: 数据抓取:github.com/Android5730... 如果有帮助到各位,可以给个star,给我一点信心去完善这个开源库

总结

本次介绍了如何获取已经安装的应用列表获取,希望能够帮到大家,当然这不是最终版本,如果在之后有改进或者增加的部分,我会回来持续修改的,如果各位有什么建议或者问题,也欢迎在评论区提出。

相关推荐
缘来是庄30 分钟前
设计模式之访问者模式
java·设计模式·访问者模式
雨白39 分钟前
Jetpack系列(三):Room数据库——从增删改查到数据库平滑升级
android·android jetpack
Bug退退退1231 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
梵高的代码色盘1 小时前
后端树形结构
java
代码的奴隶(艾伦·耶格尔)1 小时前
后端快捷代码
java·开发语言
虾条_花吹雪2 小时前
Chat Model API
java
双力臂4042 小时前
MyBatis动态SQL进阶:复杂查询与性能优化实战
java·sql·性能优化·mybatis
六毛的毛2 小时前
Springboot开发常见注解一览
java·spring boot·后端
程序漫游人2 小时前
centos8.5安装jdk21详细安装教程
java·linux
草梅友仁3 小时前
草梅 Auth 与 AI 开发心得 | 2025 年第 27 周草梅周报
github·ai编程·视觉设计