今天研究了一下APK管理器代码,发现还是比较简单的,主要就是两个列表,一个显示SD卡上面的APK文件的list,一个显示已经安装的app的list。
1.获取SD卡上的APK安装文件后,要用代码读出APK里面的信息,如icon等,的主要代码如下:
private void getUninatllApkInfo(Context context, String apkPath) {
String PATH_PackageParser = "android.content.pm.PackageParser";
String PATH_AssetManager = "android.content.res.AssetManager";
try {
// apk包的文件路径
// 这是一个Package 解释器, 是隐藏的
// 构造函数的参数只有一个, apk文件的路径
// PackageParser packageParser = new PackageParser(apkPath);
Class pkgParserCls = Class.forName(PATH_PackageParser);
Class[] typeArgs = new Class[1];
typeArgs[0] = String.class;
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
Object[] valueArgs = new Object[1];
valueArgs[0] = apkPath;
Object pkgParser = pkgParserCt.newInstance(valueArgs);
Log.d("ANDROID_LAB", "pkgParser:" + pkgParser.toString());
// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
typeArgs = new Class[4];
typeArgs[0] = File.class;
typeArgs[1] = String.class;
typeArgs[2] = DisplayMetrics.class;
typeArgs[3] = Integer.TYPE;
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
"parsePackage", typeArgs);
valueArgs = new Object[4];
valueArgs[0] = new File(apkPath);
valueArgs[1] = apkPath;
valueArgs[2] = metrics;
valueArgs[3] = 0;
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
valueArgs);
// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
// ApplicationInfo info = mPkgInfo.applicationInfo;
Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
"applicationInfo");
ApplicationInfo info = (ApplicationInfo) appInfoFld
.get(pkgParserPkg);
// uid 输出为"-1",原因是未安装,系统未分配其Uid。
Log
.d("ANDROID_LAB", "pkg:" + info.packageName + " uid="
+ info.uid);
Class assetMagCls = Class.forName(PATH_AssetManager);
Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);
Object assetMag = assetMagCt.newInstance((Object[]) null);
typeArgs = new Class[1];
typeArgs[0] = String.class;
Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
"addAssetPath", typeArgs);
valueArgs = new Object[1];
valueArgs[0] = apkPath;
assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
Resources res = context.getResources();
typeArgs = new Class[3];
typeArgs[0] = assetMag.getClass();
typeArgs[1] = res.getDisplayMetrics().getClass();
typeArgs[2] = res.getConfiguration().getClass();
Constructor resCt = Resources.class.getConstructor(typeArgs);
valueArgs = new Object[3];
valueArgs[0] = assetMag;
valueArgs[1] = res.getDisplayMetrics();
valueArgs[2] = res.getConfiguration();
res = (Resources) resCt.newInstance(valueArgs);
CharSequence label = null;
if (info.labelRes != 0) {
label = res.getText(info.labelRes);
}
Log.d("ANDROID_LAB", "label=" + label);
// 这里就是读取一个apk程序的图标
if (info.icon != 0) {
this.icon = res.getDrawable(info.icon);
appName = label.toString();
packageName = info.packageName;
}
} catch (Exception e) {
e.printStackTrace();
}
}
icon就是这个APK的图标,appName就是这个apk的名称,packageName就是这个apk的包名。
2.下面是如何获取所有的已经安装的非系统app的代码:
private ArrayList<InstalledAppInfo> getInstalledApps() {
ArrayList<InstalledAppInfo> res = new ArrayList<InstalledAppInfo>();
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0){
continue;
}
InstalledAppInfo newInfo = new InstalledAppInfo();
newInfo.setAppname(p.applicationInfo.loadLabel(getPackageManager())
.toString());
newInfo.setPname(p.packageName);
newInfo.setVersionName(p.versionName);
newInfo.setVersionCode(p.versionCode);
newInfo.setIcon(p.applicationInfo.loadIcon(getPackageManager()));
res.add(newInfo);
}
return res;
}
其中的
if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0){
continue;
}
作用是过滤掉system app。
如果需要整个Application源码的可以发邮件到bear.huangzhen@gmail.com索取。
分享到:
相关推荐
- 带文件管理器功能,支持常用的复制、重命名、删除等功能;支持安装APK文件(长按文件名); - 可以解压、压缩、替换jar/zip/apk/ear/war文件中的单个文件以及整个目录(长按文件或目录)。 - 资源分支选择功能,可...
KM盒子是一款支持文字、图片、表格混合排版的安卓手机APK电子书制作软件,编辑器支持插入超文本链接和视频链接,生成的APK电子书支持同时播放音频文件实现边看边听。软件支持APK相册生成、微书刊制作、生成chm电子书...
Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于Xposed框架可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 框架安装器可以看成是个Xposed 框架的管理工具...
于是利用Android自带的sqlite制作了一款小型密码管理工具。 此资源用安卓手机能直接安卓。绿色无病毒。我还没有能做病毒那么厉害哈哈 代码包在https://download.csdn.net/download/mountain_hua/10455152,下载后用...
☆文件管理器 可以查看,移动或删除您收到的文件,甚至可以在需要清理手机存储空间时制作备份副本。 ☆查看已连接的朋友的移动应用 程序成功连接后,您朋友的手机中的各种应用程序将被引入您自己的手机,只需点击...
android资源越来越多,但Windows下那一堆的文件名甚至是包名根本分不清是哪个应用,为方便apk包在Windows下的管理,简单制作windows下的apk文件浏览器,原创首发,需要.net2.0及以上支持,可以查看apk包的信息,如:...
KM盒子是一款支持文字、图片、表格混合排版的安卓手机电子书制作软件,编辑器支持插入超文本链接和视频链接,生成的APK电子书支持同时播放音频文件实现边看边听。软件支持APK相册生成、微书刊制作、生成chm电子书,...
编讯是一款集 网页制作,素材快速采集,文件储存,分享,在线播放于一体的贴心软件;它实现了从音视频录制、实时流媒体压缩处理、图片拍摄、管理应用(手机APP端, PC端、云空间)、制作网页、分享传递到观看的一站式...
安卓人事管理系统源码是一个简单的安卓版人事管理学生作品源码,包括职工信息的管理、个人工资信息的管理、部门管理和一个综合的查询功能,所有的信息都是储存在手机上的SQLite中,如果想让其可以联网真正的使用可以...
友益文书电子书制作利器是一款集资料管理、电子图书制作、翻页电子书制作、多媒体课件管理等于一体的多功能软件...可用于管理htm网页、mht单一网页、word文档、excel文档、幻灯片、
有对android一些基本控件的应用: 比如:1.使用listview 控件来显示SQlite ...此代码中还有与其相对应的apk文件(在SIMS/bin目录中),大家可先行放手机上看一下效果。 希望对初学者有一定的帮助。(本人自己编写)
用户可以非常直观的像在Windows中的资源管理器中一样地管理这些对象。安装界面包括安装界面的设置和安装程序两个模块,安装界面是开放性的,以插件的方式跟安装对象管理模块组合成一体,用户可以选择不同的安装界面...
加密器(SSE)通用加密应用程序 - 密码管理器,文件加密和文本加密应用程序集成在一体化解决方案中。 ➤密码存储库:在一个主密码保护的安全位置存储和管理所有密码,PIN和注释。导入/导出功能可用(压缩,完全加密...
平常生活中密码太多了不好记。 于是利用Android自带的sqlite制作了一款小型密码管理工具。 此资源用Android studio能直接打开。 apk文件我也会分享出来。
基于SpringCloud的分布式校园助手系统源码+小程序apk+项目说明.7z 一开始是以SpringBoot做为后端,以方便部署包小的主要想法,但单一的SpringBoot的项目不具备挑战性。 基于SpringCloud的分布式校园助手系统,集成了...
是国内首款原创内容型APP制作软件,互联网 创业必备的一个工具软件,知识管理提升公司软实力,将文件资料制作成手机APP应用,来方便手机随时随地阅读 。图文表格、音频、视频简单三步生成手机APP。今天是一个移动...
APPCMS是一套专业的APP内容管理系统。...提供服务器和带宽储存图片和APK资源,站长只需要一个虚拟主机即可建站 数据中心海量应用 海量安卓应用数据意添加,快速建立App应用下载站,提供OEM版本安卓市场
随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,然而许多企业下意识认为开发APP是一个有难度的技术活,这使得他们对技术的敬畏,担心APP的后续的技术支持、内容管理、维护等问题。...
7. AppsGeyser:AppsGeyser 是一个国外的网站,但提供的功能非常有趣,可以瞬间把你的博客生成一个 apk 的安装文件,并且还支持二维码下载,AppsGeyser 提供三种选择,操作都很容易:你可以任意输入一个移动网站网址...