获取安装应用的相关信息到列表

/**
 * 从该类获取所有的应用信息
 * 系统的app都安装在:system/app目录下
 * 用户应用都安装在:data/app目录下
 */
public class AppInfoProvider {
    
    /**
     * 获取安装在该手机的所有app信息,并且分好类(系统程序,用户程序)
     * 信息:包名,图片,应用名,应用安装位置,应用类型
     * @param context
     * @return
     */
    public static HashMap<String,ArrayList<AppInfo>> getAppInfos(Context context){
        //获取应用管理者
        PackageManager pm = context.getPackageManager();
        //所有安装在手机上的应用程序包信息
        List<PackageInfo> packInfos = pm.getInstalledPackages(0);
        HashMap<String,ArrayList<AppInfo>> map=new HashMap<String, ArrayList<AppInfo>>();//放所有app信息
        ArrayList<AppInfo> userList=new ArrayList<AppInfo>();//放用户程序
        ArrayList<AppInfo> systemList=new ArrayList<AppInfo>();//放系统程序
        for (PackageInfo packInfo : packInfos) {
            //packageInfo 相当于一个应用程序apk包的清单文件
            String packname=packInfo.packageName;//获取应用包名
            //packInfo.applicationInfo相当于清单文件中的application
            Drawable icon = packInfo.applicationInfo.loadIcon(pm);//获取应用图标
            String name = packInfo.applicationInfo.loadLabel(pm).toString();//应用名称
            //将得到的信息设置到自定义应用的封装类中
            AppInfo app=new AppInfo();
            app.setIcon(icon);
            app.setName(name);
            app.setPackname(packname);
            //flags携带了很多种状态信息
            int flags = packInfo.applicationInfo.flags;//应用程序信息的标记
            if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) ==0){
                app.setInRom(true);//安装在手机内存中
            }else{
                app.setInRom(false);//安装在外部存储
                System.out.println("外部");
            }
            if((flags & ApplicationInfo.FLAG_SYSTEM)==0){
                app.setUserApp(true);//用户程序
                userList.add(app);
            }else{
                app.setUserApp(false);//系统程序
                systemList.add(app);
            }
        }
        map.put("用户程序", userList);
        map.put("系统程序", systemList);
        return map;
    }
}

猜你喜欢

转载自my.oschina.net/u/248383/blog/1649308