android 判断是否为系统应用

一定要用&号 

 

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

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

       //不是系统程序

 

 

在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是程序在安装的时候由系统分配的。

 



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

  1. if (filterOption == FILTER_APPS_THIRD_PARTY) {  
  2.             List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();  
  3.             for (ApplicationInfo appInfo : installedAppList) {  
  4.                 boolean flag = false;  
  5.                 if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {  
  6.                     // Updated system app   
  7.                     flag = true;  
  8.                 } else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {  
  9.                     // Non-system app   
  10.                     flag = true;  
  11.                 }  
  12.                 if (flag) {  
  13.                     appList.add(appInfo);  
  14.                 }  
  15.             }  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值