前几天看到同事里有一个界面绚丽的应用,觉得有点意思,就让他把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中再调用系统自带的分享功能即可。

android qq apk,仿QQ获取手机中的APK并分享的实现相关推荐

  1. Android开发之仿QQ表情实现(上)

    大家晚上好,,小鹿又来了..最近小鹿特别忙,忙到没时间发表博客了(注:以下内容过于简单请大家不要喷,仅提供初学者学习) 今天发表两篇文章,分别是讲解模拟QQ表情的实现,先给大家看效果图,,,, 开始了 ...

  2. android 获取图片上某一个文字位置_android 获取手机中的所有图片或某一目录下的图片方法...

    获取手机中的所有图片,并过滤获取某一目录下的图片.(注释掉的代码可以按照目录分组) private void getAllPhotoInfo() { new Thread(new Runnable() ...

  3. Android获取手机中外置内存卡、内置内存卡、手机内存路径

    http://www.open-open.com/code/view/1433585940578 首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己 ...

  4. Android获取系统相册图片选中地址,获取手机中的所有图片地址自定义相册

    一.获取手机中的值 1.首先在使用读写sd卡权限 2.获取手机中的所有图片: 注意代码中的getGalleryPhotos(getContentResolver()) 方法获取所有地址 获取所有图片地 ...

  5. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  6. Android获取手机中外置内存卡 内置内存卡 手机内存路径

    http://www.open-open.com/code/view/1433585940578 首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己 ...

  7. android的动态tab,Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的 ...

  8. Android获取手机中的所有音乐地址

    //获取手机中的所有音乐 public static LinkedHashMap<Integer, MusicDatas> getAllMusicFile(Context context) ...

  9. 如何获取手机中连接的wifi名称?

    最近还是比较忙的,有时间了就赶紧来给大家分享点东西,今天的代码是如何获取手机中链接的WIFi名称. 已经用demo测试过了,所以就直接上代码喽. #import "ViewControlle ...

最新文章

  1. nginx+tomcat+memcache实现负载均衡、session共享
  2. 未来今日研究所:2019技术趋势报告
  3. opencv-python处理图片的一些列操作之几何变换
  4. restful api与传统api的区别(方式及语法)
  5. 原来评分卡模型的概率是这么校准的!
  6. 《Unity开发实战》——3.9节鼠标悬停时高亮显示材质
  7. 详解Java8中流(Stream)的使用
  8. [转载] 推荐的C++书籍以及阅读顺序
  9. java oop6_JavaOOP_03 构造方法
  10. 【回文串3】LeetCode 125. Valid Palindrome
  11. 寻找固定的和----2013年2月26日
  12. poj2594 Treasure Exploration 二分匹配之最小路径覆盖+传递闭包
  13. VC9、VC11、VC14、VC15库 32位 64位 免费下载
  14. 美图秀秀计算机教程,美图秀秀批处理软件详细图文版使用教程,一起学习吧
  15. 数据分析思维:分析方法和业务知识
  16. 颜色的前世今生10·HSB拾色器详解
  17. matlab中欧姆如何表示,Excel中怎样输入欧姆特殊符号
  18. 游戏录制软件哪个好?游戏录制软件推荐
  19. 警惕|这类人千万不要转行学IT
  20. Git 使用 stash暂存代码

热门文章

  1. 向 Dockerfile 传参 --build-arg 遇到的一些小坑
  2. 打卡复旦MBA首场公开课暨招生宣讲会,在不确定性中寻找确定性
  3. 利用油猴脚本显示扇贝网真实打卡日记
  4. TensorFlow2.0-GPU加速
  5. 可以伪装成计算机的应用,伪装成计算器隐藏应用软件
  6. 网站运行原理及开发流程
  7. java排序输出序号_Java对map进行排序并生成序号
  8. selenium自动化图片不加载设置
  9. 数仓建设之IP库的匹配
  10. 数据结构(二): 链表篇