登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

仿QQ获取手机中的APK并分享的实现 [复制链接]

2017-8-21 10:18
AlonMessi 阅读:1015 评论:8 赞:6
Tag:  

前几天看到同事里有一个界面绚丽的应用,觉得有点意思,就让他把APK发给我,我想反编译看看里面的代码。结果,这哥们在手机里找了好一阵子,最后给我说:手机没有root,找不到APK文件在哪里。我再让他试试其他机子,结果都差不多:要不然找起来很麻烦,要不然根本都找不到。这时,测试的妹子说:手机QQ有这个功能。我打开手机QQ一看,果然有,平时都没有注意到啊。

这个功能点稍作总结:

1. 每个item包括:应用的icon,名字,安装文件的大小,最后更新时间

2. 点击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跑跑,获取到的居然是个小绿人——系统默认的图标!再从测试妹子那里拿个小米过来,一样啊,没有正确获取到应用对应的图标。


看来想通过PackageManager获取应用的Icon是不行了,那就换个角度从PackageInfo入手试试,看到一个字段:

public ApplicationInfo applicationInfo;

官方文档的解释是: Information collected from the application。也就是说这个字段包含了App的众多信息。所以,接着看ApplicationInfo里面有啥东西,扫了一眼,看到一个东西:

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);
int size = 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中再调用系统自带的分享功能即可。

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(8)
BeatBeat 2017-8-21 10:40
厉害了
回复
一生呵护你 2017-8-21 14:10
养兵千日用兵一时 这个不久将会用到 哈哈 多谢  
回复
权小阳 2017-8-21 14:28
赞~
回复
飞仙2016 2017-8-21 14:51
mark
回复
戈英祯 2017-8-22 08:48
不错!早就用QQ的分享应用,但是不知如何实现!
回复
伊勢遼之助 2017-8-22 10:02
赞一个
回复
zyaym88 2017-8-23 15:23
作者很幽默啊!
回复
lpslpslps 2017-8-31 10:17
似乎一些应用安装包被清理了。他还是能给别人发送一个apk。这个是怎么实现呢。比较好奇
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

返回顶部