`
一岁打过熊
  • 浏览: 14157 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何制作一款APK管理器

阅读更多
今天研究了一下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索取。
分享到:
评论
1 楼 hejinya 2012-02-28  
非常受用,正在做一个文件管理器,已经给你gmail邮箱发了一封邮件,可以提供下源码不,万分感谢

相关推荐

    APk 编辑器 Android

    - 带文件管理器功能,支持常用的复制、重命名、删除等功能;支持安装APK文件(长按文件名); - 可以解压、压缩、替换jar/zip/apk/ear/war文件中的单个文件以及整个目录(长按文件或目录)。 - 资源分支选择功能,可...

    KM盒子(安卓手机APK电子书制作软件)V4.0绿色版

    KM盒子是一款支持文字、图片、表格混合排版的安卓手机APK电子书制作软件,编辑器支持插入超文本链接和视频链接,生成的APK电子书支持同时播放音频文件实现边看边听。软件支持APK相册生成、微书刊制作、生成chm电子书...

    XposedInstaller_3.1.1.apk

    Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于Xposed框架可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 框架安装器可以看成是个Xposed 框架的管理工具...

    安卓密码管理本APK

    于是利用Android自带的sqlite制作了一款小型密码管理工具。 此资源用安卓手机能直接安卓。绿色无病毒。我还没有能做病毒那么厉害哈哈 代码包在https://download.csdn.net/download/mountain_hua/10455152,下载后用...

    Xender Prime 4.4.2.apk

    ☆文件管理器 可以查看,移动或删除您收到的文件,甚至可以在需要清理手机存储空间时制作备份副本。 ☆查看已连接的朋友的移动应用 程序成功连接后,您朋友的手机中的各种应用程序将被引入您自己的手机,只需点击...

    Apk文件浏览器

    android资源越来越多,但Windows下那一堆的文件名甚至是包名根本分不清是哪个应用,为方便apk包在Windows下的管理,简单制作windows下的apk文件浏览器,原创首发,需要.net2.0及以上支持,可以查看apk包的信息,如:...

    KM盒子V2.82

    KM盒子是一款支持文字、图片、表格混合排版的安卓手机电子书制作软件,编辑器支持插入超文本链接和视频链接,生成的APK电子书支持同时播放音频文件实现边看边听。软件支持APK相册生成、微书刊制作、生成chm电子书,...

    网页创作,微网站制作,编讯APP.apk

    编讯是一款集 网页制作,素材快速采集,文件储存,分享,在线播放于一体的贴心软件;它实现了从音视频录制、实时流媒体压缩处理、图片拍摄、管理应用(手机APP端, PC端、云空间)、制作网页、分享传递到观看的一站式...

    Android毕业设计简易的人事管理系统

    安卓人事管理系统源码是一个简单的安卓版人事管理学生作品源码,包括职工信息的管理、个人工资信息的管理、部门管理和一个综合的查询功能,所有的信息都是储存在手机上的SQLite中,如果想让其可以联网真正的使用可以...

    apk电子书制作 友益文书电子书制作利器 v9.5.5

    友益文书电子书制作利器是一款集资料管理、电子图书制作、翻页电子书制作、多媒体课件管理等于一体的多功能软件...可用于管理htm网页、mht单一网页、word文档、excel文档、幻灯片、

    Android+SQlite《学生信息管理系统》(增删改查)源代码

    有对android一些基本控件的应用: 比如:1.使用listview 控件来显示SQlite ...此代码中还有与其相对应的apk文件(在SIMS/bin目录中),大家可先行放手机上看一下效果。 希望对初学者有一定的帮助。(本人自己编写)

    Tiger 安装包制作

    用户可以非常直观的像在Windows中的资源管理器中一样地管理这些对象。安装界面包括安装界面的设置和安装程序两个模块,安装界面是开放性的,以插件的方式跟安装对象管理模块组合成一体,用户可以选择不同的安装界面...

    Secret Space Encryptor Pro 2.0.apk

    加密器(SSE)通用加密应用程序 - 密码管理器,文件加密和文本加密应用程序集成在一体化解决方案中。 ➤密码存储库:在一个主密码保护的安全位置存储和管理所有密码,PIN和注释。导入/导出功能可用(压缩,完全加密...

    Android密码管理本

    平常生活中密码太多了不好记。 于是利用Android自带的sqlite制作了一款小型密码管理工具。 此资源用Android studio能直接打开。 apk文件我也会分享出来。

    课设基于SpringCloud的分布式校园助手系统源码+小程序apk+项目说明.7z

    基于SpringCloud的分布式校园助手系统源码+小程序apk+项目说明.7z 一开始是以SpringBoot做为后端,以方便部署包小的主要想法,但单一的SpringBoot的项目不具备挑战性。 基于SpringCloud的分布式校园助手系统,集成了...

    KM盒子V6.0(安卓/苹果APP制作工具).rar

    是国内首款原创内容型APP制作软件,互联网 创业必备的一个工具软件,知识管理提升公司软实力,将文件资料制作成手机APP应用,来方便手机随时随地阅读 。图文表格、音频、视频简单三步生成手机APP。今天是一个移动...

    AppCMS 专业APP内容管理系统

    APPCMS是一套专业的APP内容管理系统。...提供服务器和带宽储存图片和APK资源,站长只需要一个虚拟主机即可建站 数据中心海量应用 海量安卓应用数据意添加,快速建立App应用下载站,提供OEM版本安卓市场

    五大傻瓜式移动应用开发工具.pdf

    随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,然而许多企业下意识认为开发APP是一个有难度的技术活,这使得他们对技术的敬畏,担心APP的后续的技术支持、内容管理、维护等问题。...

    分享Appmakr式的简易App制作8大工具

    7. AppsGeyser:AppsGeyser 是一个国外的网站,但提供的功能非常有趣,可以瞬间把你的博客生成一个 apk 的安装文件,并且还支持二维码下载,AppsGeyser 提供三种选择,操作都很容易:你可以任意输入一个移动网站网址...

Global site tag (gtag.js) - Google Analytics