likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 56

系列文章目录


前言

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


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

一、应用列表bean类

主要属性有:

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

二、获取步骤

1.获取全局包数据

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

  `PackageManager packageManager = context.getPackageManager();`

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

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

List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

3.解析应用对象信息 PackageInfo

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

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

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

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

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

                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里添加如下代码

    <queries>
        <intent>
            <action android:name="android.intent.action.MAIN" />

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

四、完整工具类

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,强烈建议在子线程获取)

            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,给我一点信心去完善这个开源库

总结

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

转载自:https://juejin.cn/post/7287419040665927735
评论
请登录