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

系列文章目录

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

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

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


前言

在获取用户数据时,有时候我们需要获取用户的应用列表,比如在开发清理工具应用或者开发借贷应用,查询用户是否为老赖等时,那么我们完全可以利用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,给我一点信心去完善这个开源库

总结

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

相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717217 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
axng pmje8 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv78 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫8 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287928 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本8 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi8 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
yaoxin5211238 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python