仿QQ获取手机中的APK并分享
来源:互联网 发布:第一初恋网络剧第一季 编辑:程序博客网 时间:2024/05/29 04:45
前几天看到同事里有一个界面绚丽的应用,觉得有点意思,就让他把APK发给我,我想反编译看看里面的代码。
结果,这哥们在手机里找了好一阵子,最后给我说:手机没有root,找不到APK文件在哪里。
我再让他试试其他机子,结果都差不多:要不然找起来很麻烦,要不然根本都找不到。
这时,测试的妹子说:手机QQ有这个功能。我打开手机QQ一看,果然有,平时都没有注意到啊。
这个功能点稍作总结:
- 每个item包括:应用的icon,名字,安装文件的大小,最后更新时间
- 点击item分享其对应的APK文件
看到这里,心里怪痒痒的,我们也能做这么个类似的东西么?
能的!必须能!否则在测试的妹子面前怎么能抬起头!?
我们先获取手机中已经安装的应用:
List packageInfoList = mPackageManager.getInstalledPackages(0);
这些应用已经都躺在这里了,我们现在就一步一步地来找出每个应用的相关信息。
(1) 获取应用的名称
public String getApplicationName(String packageName,PackageManager packageManager) { String applicationName=null; try { ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); applicationName = (String) packageManager.getApplicationLabel(applicationInfo); } catch (PackageManager.NameNotFoundException e) { } return applicationName;}
嗯哼,这个不难,刚上路的小司机也可以轻松的搞定。
(2) 获取应用的icon
应用的名字我们容易获得,那它的icon又在哪里呢?
既然获得应用名字用的是:
packageManager.getApplicationLabel(applicationInfo);
那么是不是有类似的getApplicationIcon方法呢?赶紧试着敲一下代码,AS提示果然有我们想要的东西:
packageManager.getApplicationIcon(ApplicationInfo info)
嗯哼,真愉快,我们猜对啦。把代码运行起来瞅瞅,我的华为手机没有问题。换个三星试试,也对呢;再用HTC跑跑,获取到的居然是个小绿人——系统默认的图标!再从测试妹子那里拿个小米过来,一样啊,没有正确获取到应用对应的图标。
不开心了,喝口水,默默地打开度娘找答案。看到这样的方式:
//......... 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);//.........
居然用的是反射,复杂就不说了而且还影响效率。所以,在不得已的情况下还是不要这么做了。
看来想通过PackageManager获取应用的Icon是不行了,那就换个角度从PackageInfo入手试试,看到一个字段:
public ApplicationInfo applicationInfo;
官方文档的解释是: Information collected from the application。也就是说这个字段包含了App的众多信息。
所以,接着看ApplicationInfo里面有啥东西,扫了一眼,看到一个东西:
//Retrieve the current graphical icon associated with this item. public Drawable loadIcon(PackageManager pm) { return pm.loadItemIcon(this, getApplicationInfo()); }
利用该方法才可以避免在某些机型上无法获取应用的icon的bug。手边的机子试了一遍,都没问题。这个小问题解决了,就接着往下走。
(3) 获取应用的最后更新时间
这个也挺容易的,PackageInfo中有相应的字段:public long lastUpdateTime;
当然这个值是个毫秒值,需要利用SimpleDateFormat将其转换成项目需要的日期格式。
有些情况下还需要获取应用的第一次安装时间,PackageInfo中也有相应的字段:
public long firstInstallTime;
同理,也需要对其进行格式化。
(4) 获取Apk文件大小
要获取Apk文件大小,首先得找到Apk文件。就像我想周末和妹子去逛街,前提是我得有个妹子啊(打住,不说了,眼泪滴到键盘上了)但是它到底在哪里呢?幻想着利用PackageManager是不行的,它根本没有类似于getApplicationApk( )的方法。
那怎么办呢?喔,还记得前面提到的PackageInfo中的ApplicationInfo字段么?
我们继续去里面找,看看有没有啥收获,在源码501行发现一个字段:
public String sourceDir;
官方文档是这么描述的:Full path to the base APK for this application。
嗯哼,bingo!找到了就是它,它代表了APK文件的完整路径。文件路径已经拿到了,啥都好办了(就像知道了妹子住哪里,就可以……..)
File apkFile = new File(packageInfo.applicationInfo.sourceDir);
我们将该路径封装成一个文件,再获取它的大小即可.
apkFile.length() / 1024 / 1024
在此处将文件大小转换成了MB单位,比如豌豆荚的APK文件为6.46MB
好了,想要的东西我们都找到了,我们用一个ListView把每个APK的相关信息作为item展示出来就行了。
有个小问题请注意:获取手机中APK信息,这是一个耗时的过程,所以我们要在子线程中来做这个事情。
好了,看看做出来的效果
我们接着实现点击item分享Apk文件:
private class ItemClickListenerImpl implements AdapterView.OnItemClickListener{ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { File apkFile = mAppInfoList.get(position).getApkFile(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(apkFile)); startActivity(intent); } }
在此处Apk文件放到intent中再调用系统自带的分享功能即可。
界面做出来了,功能也实现了,再回过头来看,其实不是很难。
难点在于我们不知道——不知道它的icon和Apk文件到底放在哪里了。这让我想起了拉姆斯菲尔德的一段话:
We also know there are known unknowns;
that is to say we know there are some things we do not know.
But there are also unknown unknowns – the ones we don’t know we don’t know.
嘿嘿,我们不是不会,只是不知道罢了。
源码下载
原文地址:http://blog.csdn.net/lfdfhl/article/details/51286284
- 仿QQ获取手机中的APK并分享
- 仿QQ获取手机中的APK并分享
- 仿QQ获取设备中APK并分享
- Android_实现获取手机内apk并分享的功能
- 分享一些获取手机基本信息和apk信息的函数
- 高仿2017手机QQ
- Android开发实现QQ登陆并获取信息、分享消息到QQ
- 取出手机中的apk
- 取出手机中的apk
- 仿手机QQ的请求状态进度条
- android自定义Dialog,仿QQ手机浏览器
- Android之高仿手机QQ聊天
- Android之高仿手机QQ聊天
- Android之高仿手机QQ聊天
- vue-仿手机qq的demo
- 获取手机中应用apk
- 获取已安装应用在/data/app目录下的apk安装包,并分享
- 获取手机sd卡中的音乐并点击播放
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)(解决不可连的问题,解决方案在最后面)
- 【转帖】Facebook 的自动化测试
- C++11系列-lambda函数
- 安卓应用每次从后台切换到前台都会启动欢迎界面的问题
- 对象的三种状态
- 仿QQ获取手机中的APK并分享
- BFS DFS (2) 走迷宫 炸弹人
- matlab2014a中help与参考页翻译 Logical Operators: Short-Circuit && ||
- 我的数组类
- 怎么把word转换成pdf文档格式
- oracle sequence跳号 并且回跳
- GCD
- C++11系列-区间迭代
- PHP(FastCGI)在Nginx的alias下404的解决方案