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
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);
}
}