系列文章目录
分篇(一):【数据抓取(一)】手机通讯录数据获取
分篇(二):数据抓取(二)&定位方案:地址信息的获取
前言
在获取用户数据时,有时候我们需要获取用户的应用列表,比如在开发清理工具应用或者开发借贷应用,查询用户是否为老赖等时,那么我们完全可以利用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,给我一点信心去完善这个开源库
总结
本次介绍了如何获取已经安装的应用列表获取,希望能够帮到大家,当然这不是最终版本,如果在之后有改进或者增加的部分,我会回来持续修改的,如果各位有什么建议或者问题,也欢迎在评论区提出。