HardBirch

Android上获取与区分手机上的应用程序(系统/用户)

时间:13-01-08 栏目:android学习笔记 作者:魔豆先生 评论:0 点击: 6,221 次

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
    //不是系统程序

声明: 本文由( 魔豆先生 )原创编译,转载请保留链接: Android上获取与区分手机上的应用程序(系统/用户)

Android上获取与区分手机上的应用程序(系统/用户):等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐