How do I check if an app is a non-system app in Android?

后端 未结 13 1234
无人共我
无人共我 2020-11-28 22:51

I am getting a list of ApplicationInfo Objects with packageManager.getInstalledApplications(0) and attempting to categorize them by whether or not they are a sy

13条回答
  •  温柔的废话
    2020-11-28 23:19

    Here is an AppUtil I wrote for that purpose.
    Usage example:

    new AppsUtil(this).printInstalledAppPackages(AppsUtil.AppType.USER);
    

    AppsUtil.java

    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.util.Log;
    
    public class AppsUtil
    {
        public static final String  TAG = "PackagesInfo";
        private Context             _context;
        private ArrayList _PckgInfoList;
    
        public enum AppType 
        {
            ALL {
                @Override
                public String toString() {
                  return "ALL";
                }
              },
            USER {
                @Override
                public String toString() {
                  return "USER";
                }
              },
            SYSTEM {
                @Override
                public String toString() {
                  return "SYSTEM";
                }
              }
        }
    
        class PckgInfo
        {
            private AppType appType;
            private String  appName     = "";
            private String  packageName = "";
            private String  versionName = "";
            private int     versionCode = 0;
    
            private void prettyPrint()
            {
                Log.i(TAG, appName + "\n  AppType: " + appType.toString() + "\n  Package: " + packageName + "\n  VersionName: " + versionName + "\n  VersionCode: " + versionCode);
            }
        }
    
        public AppsUtil(Context context)
        {
            super();
            this._context = context;
            this._PckgInfoList = new ArrayList();
        }
    
        public void printInstalledAppPackages(AppType appType)
        {
            retrieveInstalledAppsPackages();
            Log.i(TAG, "");
            for (int i = 0; i < _PckgInfoList.size(); i++)
            {
                if (AppType.ALL == appType)
                {
                    _PckgInfoList.get(i).prettyPrint();
                }
                else
                {
                    if (_PckgInfoList.get(i).appType == appType)
                        _PckgInfoList.get(i).prettyPrint();
                }
            }
        }
    
        public ArrayList getInstalledAppPackages(AppType appType)
        {
            retrieveInstalledAppsPackages();
            ArrayList resultPInfoList = new ArrayList();
    
            if (AppType.ALL == appType)
            {
                return _PckgInfoList;
            }
            else
            {
                for (int i = 0; i < _PckgInfoList.size(); i++)
                {
                    if (_PckgInfoList.get(i).appType == appType)
                        resultPInfoList.add(_PckgInfoList.get(i));
                }
                return resultPInfoList;
            }
        }
    
        private void retrieveInstalledAppsPackages()
        {
            PackageManager pm = _context.getPackageManager();
            List packs = pm.getInstalledPackages(0);
            for (PackageInfo pi : packs)
            {
                try
                {
                    PckgInfo newInfo = new PckgInfo();
                    ApplicationInfo ai = pm.getApplicationInfo(pi.packageName, 0);
    
                    newInfo.appType = getAppType(ai);
                    newInfo.appName = pi.applicationInfo.loadLabel(pm).toString();
                    newInfo.packageName = pi.packageName;
                    newInfo.versionName = pi.versionName;
                    newInfo.versionCode = pi.versionCode;
                    _PckgInfoList.add(newInfo);
                }
                catch (NameNotFoundException e)
                {
                    e.printStackTrace();
                }
            }
        }
    
        AppType getAppType(ApplicationInfo ai)
        {
            AppType resultType ;
            if (isUserApp(ai))
                resultType = AppType.USER;
            else
                resultType = AppType.SYSTEM;
    
            return resultType;
        }
    
        boolean isUserApp(ApplicationInfo ai)
        {
            int mask = ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
            return (ai.flags & mask) == 0;
        }
    }
    

提交回复
热议问题