Android手机上获取已经安装的应用,可以使用以下一行代码:
List<PackageInfo> packageList = 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/目录下的应用存在与否的判断来过滤;
String applicationName;
String packageName;
int userInstalledApk = 0;
int systemInstalledApk = 0;
PackageManager packagemgr= getPackageManager();
List<PackageInfo> packageList= packagemgr.getInstalledPackages(0);
count = packageList.size();
for(int i = 0; i < count; i++) {
PackageInfo pi = packageList.get(i);
if (pi.versionName == null)
continue;
//判断该软件包是否在/data/app目录下
File file = new File( "/data/app/" + pi.packageName + ".apk");
if(!file.exists())
systemInstalledApk++;
userInstalledApk++;
/**
* 应用程序的名字
*/
applicationName = pi.applicationInfo.loadLabel(packagemgr).toString();
packageName = pi.packageName;
}
方法四:通过uid来过滤系统系统的安装包。android系统的安装包uid是在区间 1000 ~ 9999 ,所以只要判断package的uid > 10000,就肯定不是系统应用,代码如下:(uid是程序在安装的时候由系统分配的)
if(pi.applicationInfo.uid > 10000)
//非系统程序
方案五:最有方案。
ApplicationInfo applicationInfo = pi.applicationInfo;
/**
* Value for {@link #flags}: if set, this application is installed in the
* device's system image.
*/
if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0)
//系统程序
else
//不是系统程序
List<PackageInfo> packageList = 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/目录下的应用存在与否的判断来过滤;
String applicationName;
String packageName;
int userInstalledApk = 0;
int systemInstalledApk = 0;
PackageManager packagemgr= getPackageManager();
List<PackageInfo> packageList= packagemgr.getInstalledPackages(0);
count = packageList.size();
for(int i = 0; i < count; i++) {
PackageInfo pi = packageList.get(i);
if (pi.versionName == null)
continue;
//判断该软件包是否在/data/app目录下
File file = new File( "/data/app/" + pi.packageName + ".apk");
if(!file.exists())
systemInstalledApk++;
userInstalledApk++;
/**
* 应用程序的名字
*/
applicationName = pi.applicationInfo.loadLabel(packagemgr).toString();
packageName = pi.packageName;
}
方法四:通过uid来过滤系统系统的安装包。android系统的安装包uid是在区间 1000 ~ 9999 ,所以只要判断package的uid > 10000,就肯定不是系统应用,代码如下:(uid是程序在安装的时候由系统分配的)
if(pi.applicationInfo.uid > 10000)
//非系统程序
方案五:最有方案。
ApplicationInfo applicationInfo = pi.applicationInfo;
/**
* Value for {@link #flags}: if set, this application is installed in the
* device's system image.
*/
if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0)
//系统程序
else
//不是系统程序