文档章节

案例:PackageManager

当空皓月
 当空皓月
发布于 2014/09/30 17:52
字数 1228
阅读 277
收藏 8
点赞 0
评论 0

1。http://blog.csdn.net/qinjuning/article/details/6867806    此人博客写的不错,有待研究啊

2。http://blog.csdn.net/liranke/article/details/17717571 简直就是超级大神!

3。下面来看咱们的案例

PackageManager pm = getPackageManager();

下面是获取当前应用的基本信息:

//图标

 Drawable app_icon =pm.getApplicationIcon(getApplicationInfo());

// 获取名称
  String app_name = (String) pm.getApplicationLabel(getApplicationInfo());

PackageInfopackageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);

mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
   //mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
   mAppInfo.setVersionName(packageInfo.versionName);
   mAppInfo.setVersionCode(packageInfo.versionCode);
   mAppInfo.setPackageName(packageInfo.packageName);
   mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
   mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);

下面是获取手机中应用的基本信息:

List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
  for (PackageInfo packageInfo : installedPackages) {
   AppInfo mAppInfo = new AppInfo();
   mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
   //mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
   mAppInfo.setVersionName(packageInfo.versionName);
   mAppInfo.setVersionCode(packageInfo.versionCode);
   mAppInfo.setPackageName(packageInfo.packageName);
   mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
   mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);
   
   // Only display the non-system app info
   if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
    // 如果非系统应用,则添加至appList
    mAppInfos.add(mAppInfo);
   }
  }

下面是获取手机桌面上应用的基本信息:

Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : queryIntentActivities) {

         AppInfo mAppInfo = new AppInfo();
   mAppInfo.setAppIcon(resolveInfo.loadIcon(pm));
   mAppInfo.setAppLabel((String)resolveInfo.loadLabel(pm));
   mAppInfo.setPackageName(resolveInfo.activityInfo.packageName);
   mAppInfos.add(mAppInfo);
  }

效果如图:

关于apk的安装路径和大小:

豌豆荚
10-04 03:38:02.178: I/System.out(2458): sourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): dataDir:/data/data/com.wandoujia.phoenix2
10-04 03:38:02.178: I/System.out(2458): publicSourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): 豌豆荚的apk大小:5.13MB

API Demos
10-04 03:38:02.002: I/System.out(2458): sourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.006: I/System.out(2458): dataDir:/data/data/com.example.android.apis
10-04 03:38:02.006: I/System.out(2458): publicSourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.026: I/System.out(2458): API Demos的apk大小:4.58MB

电话
10-04 03:38:01.802: I/System.out(2458): sourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.802: I/System.out(2458): dataDir:/data/data/com.android.voicedialer
10-04 03:38:01.802: I/System.out(2458): publicSourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.810: I/System.out(2458): Voice Dialerapk的大小:124KB

闹钟
10-04 03:38:02.202: I/System.out(2458): sourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): dataDir:/data/data/com.android.deskclock
10-04 03:38:02.202: I/System.out(2458): publicSourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): Clockapk大小:2.14MB

代码实现:
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
  for (ApplicationInfo applicationInfo : installedApplications) {
   String sourceDir=applicationInfo.sourceDir;//安装路径
   String dataDir=applicationInfo.dataDir;
   String publicSourceDir=applicationInfo.publicSourceDir;
   System.out.println("sourceDir:"+sourceDir);
   System.out.println("dataDir:"+dataDir);
   System.out.println("publicSourceDir:"+publicSourceDir);
   int size = Integer.valueOf((int) new File(publicSourceDir).length());
   System.out.println(applicationInfo.loadLabel(pm)+"的apk大小:"+Formatter.formatFileSize(this, size));
  }

这个大小和茄子快传,快牙,闪传,豌豆荚上的软件管理中显示的是一致的

 

应用程序的大小:

豌豆荚
10-04 03:58:18.234: I/System.out(2538): cacheSize:28.00KB,codeSize:11.11MB,dataSize:8.96MB
10-04 03:58:18.238: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.238: I/System.out(2538): 豌豆荚的总大小:20.10MB

API Demos
10-04 03:58:18.122: I/System.out(2538): cacheSize:12.00KB,codeSize:6.43MB,dataSize:0.00B
10-04 03:58:18.122: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.122: I/System.out(2538): API Demos的总大小:6.44MB

电话
10-04 03:58:18.310: I/System.out(2538): cacheSize:12.00KB,codeSize:60.00KB,dataSize:12.00KB
10-04 03:58:18.310: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.310: I/System.out(2538): Voice Dialer的总大小:84.00KB

闹钟
10-04 03:58:17.818: I/System.out(2538): cacheSize:12.00KB,codeSize:392KB,dataSize:60.00KB
10-04 03:58:17.862: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:17.866: I/System.out(2538): Clock的总大小:464KB


目录结构如下:

介绍一篇aidl的文章:http://www.cnblogs.com/rookietong/archive/2013/03/16/2962623.html

android.content.pm,这个包及包下的所有东西都是死的,是系统的aidl文件,这些文件可以在github上下载。

IPackageDataObserver.aidl

package android.content.pm;

/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}

IPackageStatsObserver.aidl

package android.content.pm;

import android.content.pm.PackageStats;
/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageStatsObserver {
   
    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}

PackageStats.aidl
package android.content.pm;

parcelable  PackageStats;

软件包的大小封装在PackageStats这个类中,要获取这个类不能用构造方法获取,这一点也不知道为什么。他是通过PackageManager的hide方法getPackageSizeInfo()来得到,但是要调用这个hide方法就要用java的反射机制,不然pm.不出来。应用aidl的代码如下:

List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);

for (final ResolveInfo resolveInfo : queryIntentActivities) {
   try {
    Method getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
    getPackageSizeInfo.invoke(pm, resolveInfo.activityInfo.packageName, new IPackageStatsObserver.Stub() {
     @Override
     public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
      // TODO Auto-generated method stub
      Long cacheSize=packageStats.cacheSize;
      Long codeSize=packageStats.codeSize;
      Long dataSize=packageStats.dataSize;
      Long externalCacheSize=packageStats.externalCacheSize;
      Long externalCodeSize=packageStats.externalCodeSize;
      Long externalDataSize=packageStats.externalDataSize;
      Long externalMediaSize=packageStats.externalMediaSize;
      Long externalObbSize=packageStats.externalObbSize;
      System.out.println("cacheSize:" + Formatter.formatFileSize(getApplication(), cacheSize) + ",codeSize:" + Formatter.formatFileSize(getApplication(), codeSize) + ",dataSize:" + Formatter.formatFileSize(getApplication(), dataSize));
      System.out.println("externalCacheSize:" + Formatter.formatFileSize(getApplication(), externalCacheSize) + ",externalCodeSize:" + Formatter.formatFileSize(getApplication(), externalCodeSize) + ",externalDataSize:" + Formatter.formatFileSize(getApplication(), externalDataSize)+
        "externalMediaSize:"+Formatter.formatFileSize(getApplication(), externalMediaSize) + ",externalObbSize:" + Formatter.formatFileSize(getApplication(), externalObbSize) );
     String totalSize=Formatter.formatFileSize(getApplication(), (packageStats.cacheSize + packageStats.codeSize +packageStats.dataSize)/*/(1024*1024)*/);
     System.out.println((String) resolveInfo.loadLabel(pm)+"的总大小:" + totalSize /*+"M"*/);
     }
    });
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }

这个大小是和猎豹清理大师软件管理中的大小是一致的


点击item启动应用程序:

启动另外的一个应用程序的Activity:

http://www.apkbus.com/android-43480-1-1.html

http://gundumw100.iteye.com/blog/1138158  (其中这个比较好)

代码实现:

lv.setAdapter(adapter);  

       lv.setOnItemClickListener(new OnItemClickListener() {  

            @Override  

            public void onItemClick(AdapterView<?> parent, View view,  int position, long id) {  

                String packageName = (String) items.get(position).get( "packageName");  

                //取到点击的包名  

                Intent i = pm.getLaunchIntentForPackage(packageName);  

                //如果该程序不可启动(像系统自带的包,有很多是没有入口的)会返回NULL  

                if (i != null)  

                    startActivity(i);  

            }  

        });  


© 著作权归作者所有

共有 人打赏支持
当空皓月
粉丝 13
博文 179
码字总数 67070
作品 0
郑州
Android 应用跳转到拨打电话界面或qq进行聊天(qq咨询)

拨打电话: /** * 调用拨号界面 * @param phone 电话号码 */public void callPhone(String phone) { } /** * 调用拨号功能 * @param phone 电话号码 */ private void call(String phone) { I......

先进青年
2016/11/08
88
0
获取应用的当前版本号&获取当前android系统的版本号

获取当前应用的版本号: private String getVersionName() throws Exception { // 获取packagemanager的实例 PackageManager packageManager = getPackageManager(); // getPackageName()是你......

伽罗kapple
2014/10/18
1K
0
Android 获取应用程序版本号

功能:获取版本号 思路:版本号位置在AndroidManifest.xml文件中,需要找到一个类可以获取该位置的信息 需要使用到getPackageInfo和 PackageManager 这两个类。 一、getPackageInfo介绍和用法...

FergusJ
2015/09/04
0
0
Android7.0 MTK方案 静默安装和卸载

一、android安装apk介绍 安装apk有两种方法 1、调用系统PackageInstaller.apk进行安装 这个系统apk所在目录为:android/packages/apps/PackageInstaller 2、串口命令安装”pm install –r h...

DaSunWarman
2017/12/02
0
0
一个应用程序和另一个应用程序apk文件信息

应用场景:对于我们自己开发的两个应用程序,一个应用程序的包名为 aa.bb.cc,软件名叫a,它的入口Activity为 aaActivity(入口activity就是在AndroidManifest.xml中标签——<action android...

lxp198837
2012/06/27
0
0
【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManager();List packageInfoList = packageManager.get...

晨曦之光
2012/03/01
1K
1
仔仔手机安全卫士demo(一)

第一步:设计splash页面,即进入主页面前的一个欢迎页面 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool......

Angels_安杰
2015/10/13
21
0
android软件eclipse run的时候可以安装到手机,打包之后在手机上无法安装

一些日志,中间看似没用的我去掉了,完整日志如需要可发上来 02-29 22:46:07.767: I/PackageInstaller(18417): downloaded app uri=file:///storage/emulated/0/UCDownloads/chazhuanxian.ap......

noday
2016/02/29
340
3
Android判断Intent是否存在,是否可用

当Android系统调用Intent时,如果没有找到Intent匹配的Activity组件(Component),那么应用将报以下错误: 如果没有使用UncaughtExceptionHandler类来处理全局异常,那么程序将异常退出造成...

飞越围墙
2012/10/13
0
0
Android中如何获取应用版本号(转)

应用场景: 1、在界面中显示应用程序的版本号; 2、用户启动该应用,后台判断该应用是否是最新版本。 上述情景都需要在程序中自动获取到应用的版本号。 思路简介: 在Android中,应用程序的版...

chuiyuan
2014/10/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring boot中swagger2使用

1.pom.xml中添加 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version>......

说回答
7分钟前
0
0
tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
19分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
25分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
25分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
39分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
40分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
48分钟前
1
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
51分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
58分钟前
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部