android 判断是否为系统应用
2013-10-16 11:14
991 查看
一定要用&号
方法四:这个方法应该是最优的。
//不是系统程序
在google上输入以上的关键字+android,可以搜到的代码:
虽然,有些代码号称可以过滤掉系统自身的应用程序,但是只要细看代码就会发现,好像里面的那个布尔变量没有起到什么过滤的作用。
方法一 :通过获取的安装包(包括安装的与系统自身的应用程序),对其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/"下的所有文件,因此可以用如下的方法来获取本机上已经安装的软件(排除系统的应用程序):
方法三 、可以通过uid来过滤系统系统的安装包,因为android系统中的uid从 1000 ~ 9999 都是给系统程序保留的,所以只要判断package的uid >10000即可判定该程序是非系统程序。
uid是程序在安装的时候由系统分配的。
Android源码上的方法 com/android/settings/ManageApplications.java
[java]
view plaincopyprint?
if (filterOption == FILTER_APPS_THIRD_PARTY){
List<ApplicationInfo>appList =new ArrayList<ApplicationInfo>();
for (ApplicationInfo appInfo : installedAppList){
boolean flag = false;
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!= 0){
// Updated system app
flag = true;
} else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)== 0){
// Non-system app
flag = true;
}
if (flag){
appList.add(appInfo);
}
}
方法四:这个方法应该是最优的。
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 | } |
1 | if
10000 ) |
2 | //非系统程序 |
Android源码上的方法 com/android/settings/ManageApplications.java
[java]
view plaincopyprint?
if (filterOption == FILTER_APPS_THIRD_PARTY){
List<ApplicationInfo>appList =new ArrayList<ApplicationInfo>();
for (ApplicationInfo appInfo : installedAppList){
boolean flag = false;
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!= 0){
// Updated system app
flag = true;
} else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)== 0){
// Non-system app
flag = true;
}
if (flag){
appList.add(appInfo);
}
}
相关文章推荐
- android下判断一个应用app是否是系统rom集成的方法
- android中判断应用是否是系统应用
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- Android----获得当前应用包名、当前activity的名字、判断是否是系统桌面、service类
- Android Tips: 如何判断所安装的应用是否为系统应用
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- android下判断一个应用app是否是系统rom集成的方法
- Android 判断手机是否安装某个应用
- Android判断应用是否存在
- 判断是否为系统应用的几种方法[整理]
- android判断应用是否在后台运行的方法
- Android之后台服务判断本应用Activity是否处于栈顶
- Android应用如何判断系统升级了?
- android 判断当前应用是否处于活动状态
- android 判断某个应用是否在运行
- Android 判断前台应用是否为桌面
- android 判断应用是否在后台的工具类
- 如何判断 Android 应用的 Apk 签名是否一致?
- Android判断应用是否是从后台回到前台