Android中级篇之区分系统程序和安装程序

2011-05-20 21:37:08

出处:http://www.cnblogs.com/mengshu-lbq/archive/2010/09/09/1822237.html

在google上输入以上的关键字+ android,可以搜到的代码:

1 List<PackageInfo> packs = getPackageManager().getInstalledPackages( 0 );

虽然,有些代码号称可以过滤掉系统自身的应用程序,但是只要细看代码就会发现,好像里面的那个布尔变量没有起到什么过滤的作用。

  方法一 :通过获取的安装包(包括安装的与系统自身的应用程序),对其android.content.pm.PackageInfo的packageName 进行过滤,

但是Anrodi与google的包比较容易过滤掉,但需要对不同产商进行适配;

  方法二 :枚举 \data\app 文件夹,其下的*.apk文件 就是本机安装的软件,而\system\App下的*.apk文件就是系统自带的软件,

由于普通的程序是无法读取这两个文件夹的,需要root权限吧,因此该方法也行不通(用File.listFiles() + android.permission.FACTORY_TEST 权限 还是不能枚举出文件)

虽然不能枚举文件夹 "\data\app\",但我们可以访问(read)文件夹"\data\app\"下的所有文件,因此可以用如下的方法来获取本机上已经安装的软件(排除系统的应用程序):

01 PackageManager pckMan = getPackageManager();
02 List<PackageInfo> packs = pckMan.getInstalledPackages( 0 );
03 count = packs.size();
04 String name;
05 int installedNum = 0 ;
06 for ( int i = 0 ; i < count; i++) {
07 PackageInfo p = packs.get(i);
08 if (p.versionName == null )
09 continue ;
10
01 //判断该软件包是否在/data/app目录下
02 File f1 = new File( "/data/app/" + p.packageName + ".apk" );
03 if (!f1.exists()) continue ;
04
05 installedNum++;
06 /**
07 * 应用程序的名字
08 */
09 name = p.applicationInfo.loadLabel(pckMan).toString();
10 }

方法三 、可以通过uid来过滤系统系统的安装包,因为android系统中的uid从 1000 ~ 9999 都是给系统程序保留的,所以只要判断package的uid > 10000即可判定该程序是非系统程序。

1 if (p.applicationInfo.uid > 10000 )
2 //非系统程序

uid是程序在安装的时候由系统分配的。

方法四:这个方法应该是最优的。

1 ApplicationInfo appInfo = p.applicationInfo;
2 /**
3 * Value for {@link #flags}: if set, this application is installed in the
4 * device's system image.
5 */
6 if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0 )
7 //系统程序
8 else

//不是系统程序



Android源码上的方法 com/android/settings/ManageApplications.java


更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. android Service理解
  3. Android(安卓)Bitmap内存限制
  4. android上怎样让一个Service开机自动启动
  5. android AIDL简单步骤
  6. Android应用程序打包时,出现错误:Android(安卓)Lint "app_name" i
  7. Android“再按一次退出程序”实现
  8. Android(安卓)百分比布局详解及实例代码
  9. Android(安卓)利用soap协议与服务端进行通信

随机推荐

  1. Android OKHttp3 超时设置和异常捕获
  2. Android 用ScrollView和HorizontalScroll
  3. Android 设置字体大小和显示大小后界面混
  4. Android Bitmap 与 Drawable之间的转换
  5. 关于android pendingIntent 传递Parcelab
  6. android典型代码系列(六)------drawable
  7. android 获取屏幕的长和宽
  8. Android(安卓)kernel下载编译方法
  9. android 文件保存方法 sd卡中或系统
  10. android 动态设置控件大小