0

我正在遵循以下链接中给出的代码:

http://xjaphx.wordpress.com/2011/06/12/create-application-launcher-as-a-list/

列出我手机上已安装的应用程序。

但这里的问题是它列出了所有应用程序。

所有系统相关的应用程序也喜欢。

网络位置、Google play 声音搜索、启动器、包访问助手

如何过滤不显示不可启动的应用程序?

我尝试了以下方法:

而不是这个

  c.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA) 

我试过了:

  c.getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES)

但同样的结果。

有人可以帮我解决这个问题吗?

谢谢!

更新:

感谢MH指导。现在我只能从 Playstore 看到已安装的应用程序。如何获取系统默认应用程序,如 Gmail、时钟、设置、谷歌地图等。

这是我尝试过的:

    List<ApplicationInfo> appInfos = c.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
    List<ApplicationInfo> userAppInfos = new ArrayList<ApplicationInfo>();
    List<ApplicationInfo> systemAppInfos = new ArrayList<ApplicationInfo>();
    for (ApplicationInfo info : appInfos) 
    {
        if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) 
        {
            systemAppInfos.add(info);
        }
        else
        {
            userAppInfos.add(info);
        }
    }
    return userAppInfos;
4

2 回答 2

0

听起来您想获取已安装应用程序的列表,但过滤掉任何系统应用程序。如果确实如此,您可以使用返回的ApplicationInfo实例来确定该应用是系统应用还是用户安装的常规应用。

假设我们想将已安装的应用程序分成两个列表:一个是系统应用程序,另一个是下载的应用程序。我们可以这样做:

List<ApplicationInfo> appInfos = getInstalledApplications(PackageManager.GET_META_DATA);
List<ApplicationInfo> userAppInfos = new ArrayList<ApplicationInfo>();
List<ApplicationInfo> systemAppInfos = new ArrayList<ApplicationInfo>();
for (ApplicationInfo info : appInfos) {
    if (info.flags & ApplicationInfo.FLAG_SYSTEM != 0) systemAppInfos.add(info);
    else userAppInfos.add(info);
}

请注意,该ApplicationInfo.FLAG_SYSTEM常数表示:

如果设置,此应用程序将安装在设备的系统映像中。

您可能也可能不想做一些事情ApplicationInfo.FLAG_UPDATED_SYSTEM_APP

如果此应用程序已作为内置系统应用程序的更新安装,则设置此项。

于 2013-08-21T08:08:46.160 回答
0

您对“仅特定应用程序”的确切含义是什么?如果您想过滤掉不可启动的应用程序或软件包(例如,只想显示在应用程序屏幕中显示的应用程序),您可以在 PackageManager 中使用带有适当意图的queryIntentActivities方法,而不是 getInstalledApplications。

    final PackageManager pm = getPackageManager();
    final Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);

    if( list != null ){
        for( ResolveInfo resolveInfo : list ){
            Log.d("Apps", resolveInfo.loadLabel(pm).toString());
        }
    }
于 2013-08-21T07:47:19.113 回答