获取安装的应用程序信息

来源:互联网 发布:海康网络视频监控方案 编辑:程序博客网 时间:2024/05/17 05:54
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
    //不是系统程序
原创粉丝点击