不管是“ES文件浏览器”、“QQ”等应用,它们都可以获取本机已安装的应用程序信息,还可以发送安装包(apk文件)给别人。
这两天查了一些资料,有所收获,整理一下,写在下面。
第一步:获取已安装的应用列表
应用分为两种:一种是系统自带的,另一种是用户自己安装的。
通过下面代码可以获取所有应用的信息:
List apps = getPackageManager().getInstalledApplications(0);
通过以下代码判断是否是应用分类:
if((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
{
//非系统应用
}
else
{
//系统应用
}
第二步:获取已安装的应用对应的安装文件(apk)
//这个属性指定了apk的路径(如:/data/app/bassy.hair.main-1.apk)
ApplicationInfo.sourceDir
//一般来说,这两个属性的值和上面的属性的值相同
ApplicationInfo.publicSourceDir
ApplicationInfo.scanPublicsourceDir
默认情况下,必须要获取root权限,才能访问/data/app目录的,
如果没有root,用文件浏览器进入/data目录,会发现里面为空,并没有app文件夹
但是,有一点挺奇怪的,看下面截图
上面是adb shell工具直接查询已安装应用apk文件的属性
注意权限信息“-rw-r--r--”,这表明"/data/app/bassy.hair.main-1.apk"是可读的。
换句话说,我们可以在程序中直接访问该文件。
另外介绍ApplicationInfo的两个常用方法:
public CharSequence loadLabel(PackageManager pm)
public Drawable loadIcon(PackageManager pm)
ApplicationInfo.loadLabel用于获取应用程序的名称
ApplicationInfo.loadIcon用于获取应用程序的图标
部分代码:
/** 获取已安装应用信息(不包含系统自带) */
private ArrayList getAppInfo()
{
List apps = getPackageManager().getInstalledApplications(
PackageManager.GET_SIGNATURES);
ArrayList infos = new ArrayList();
for (ApplicationInfo info : apps)
{
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
{
// 非系统应用
AppInfo appInfo = new AppInfo();
appInfo.name = info.loadLabel(getPackageManager()).toString();
appInfo.icon = info.loadIcon(getPackageManager());
appInfo.path = info.sourceDir;
appInfo.packageName = info.packageName;
infos.add(appInfo);
}
}
return infos;
}
public class AppInfo implements Serializable
{
/** 序列号 */
private static final long serialVersionUID = -6660233212727684115L;
/** 名称 */
public String name;
/** (路径) */
public String path;
/** 图标 */
public Drawable icon;
/** 包名 */
public String packageName;
}
参考资料: