获取Android设备上已安装应用的数量?

时间:2016-08-19 15:47:22

标签: java android

我正在制作Android启动器,作为为自己制作Android应用程序的介绍,我的部分设计要求我知道用户设备上安装了多少个应用程序,并且最好只计算那些正常应用程序可以推出。我希望将这些应用程序存储在全局整数变量中。只考虑到这个目标,将这个数字作为变量检索的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用getInstalledApplications()的{​​{1}}方法。

来自Picasso

  

返回安装在其上的所有应用程序包中的PackageManager个   设备。如果已设置标记List,则列出所有标记   应用程序,包括使用GET_UNINSTALLED_PACKAGES删除的应用程序(部分   

将返回已安装的数据目录应用程序

这样的事情应该有效:

DONT_DELETE_DATA

要过滤掉系统应用,您可以执行以下操作:

int numberOfInstalledApps = getPackageManager(0).getInstalledApplications().size();

答案 1 :(得分:2)

所有非系统应用程序都有一个启动Intent,所以你只需要获取所有应用程序的列表并检查,其中有多少具有启动意图,或者如果没有那么该应用程序将是一个系统应用程序。包管理器可以轻松检索所有应用程序,然后在查找可用的启动意图时查看所有应用程序的信息。

根据建议by Darshan Patel @Brad Larson♦

PackageManager pm = getPackageManager();
int nonSysAppsCount=0;
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for(ApplicationInfo packageInfo:packages){
    if( pm.getLaunchIntentForPackage(packageInfo.packageName) != null ){
                String currAppName = pm.getApplicationLabel(packageInfo).toString();
           nonSysAppsCount++;
               //This app is a non-system app
    }
    else{
        //System App
    }
}

答案 2 :(得分:1)

如果您正在寻找在给定设备上安装的非系统应用程序,您可以执行以下操作:

public static ArrayList<String> getInstalledApps() {
    ArrayList<String> appList = new ArrayList<>();
    List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
    for (int i=0; i < packList.size(); i++) {
        PackageInfo packInfo = packList.get(i);
        if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            appList.add(appName);
            Log.e("App >" + Integer.toString(i), appName);
        }
    }
    return appList;
}

所以,你可以通过这样做:

int number = getInstalledApps().size();

此外,您可以通过以下方式启动任何应用程序:

Intent myIntent = new Intent(Intent.ACTION_MAIN, null);
myIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List appsList = context.getPackageManager().queryIntentActivities(myIntent, 0);