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

系列文章目录

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

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

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


前言

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

总结

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

相关推荐
xweiran1 小时前
CAS操作的底层原理(总线锁定机制和缓存锁定机制 )
java·cas·处理器·总线锁定·缓存锁定
Miraitowa_cheems1 小时前
[JavaEE] Spring IoC&DI
java·spring·java-ee
V+zmm101341 小时前
基于微信小程序的水果销售系统的设计与实现springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·springboot
头发那是一根不剩了1 小时前
java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
java
lichong9511 小时前
【Flutter&Dart】 listView.builder例子二(14 /100)
android·javascript·flutter·api·postman·postapi·foxapi
小白起 v2 小时前
三天学完微服务其二
java·微服务·架构
huiyunfei2 小时前
MinorGC FullGC
java·jvm·算法
XWM_Web2 小时前
JavaAPI.02.包装类与正则表达式
java·开发语言·学习·eclipse
PangPiLoLo2 小时前
架构学习——互联网常用架构模板
java·学习·微服务·云原生·架构·系统架构·nosql
!!!5252 小时前
SpringBoot-web入门程序剖析
java·spring boot·后端