【问题标题】:List of Application in AndroidAndroid中的应用程序列表
【发布时间】:2013-08-21 07:02:14
【问题描述】:

我正在关注以下链接中给出的代码:

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

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

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

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

网络位置, 谷歌播放的声音搜索, 发射器, 包访问助手

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

我尝试了以下方法:

而不是这个

  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;

【问题讨论】:

    标签: java android package-managers


    【解决方案1】:

    “仅限特定应用”究竟是什么意思?如果您想过滤掉不可启动的应用程序或软件包(例如,只想显示在应用程序屏幕中显示的应用程序),您可以使用 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());
            }
        }
    

    【讨论】:

    • 感谢您的快速说明。看起来我无法使用示例项目中给出的代码更新代码。这可能吗,如果可以的话如何?
    • 您可以在示例中修复 AppInfoAdapter 适配器的某些部分。如果你检查我使用的ResolveInfo类,那里已经有activityInfo字段,所以你可以使用它。
    【解决方案2】:

    听起来您想获取已安装应用程序的列表,但过滤掉任何系统应用程序。如果确实如此,您可以使用返回的 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做某事:

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

    【讨论】:

    • 感谢您的快速说明。看起来我无法更新本教程中显示的以下包中的代码。 xjaphx.wordpress.com/2011/06/12/… 有没有可能,如果有怎么办?
    • 我不确定你的意思。如果要更改教程中显示的应用程序列表,只需更改传递给AppInfoAdapter 的列表即可。在我的回答中使用示例:基本上教程现在传入appInfos,但是如果您复制粘贴上面的一些代码,您可以传递userAppInfos 来代替显示完整列表的子集。跨度>
    • 我该怎么做?教程代码: public static List getInstalledApplication(Context c) { return c.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);在这种情况下我会用你的示例代码返回什么?你能帮我解决一下sn-p吗?谢谢!
    • 我试过了.. 有效。但问题是我无法获得任何默认应用程序,如 Gmail 应用程序、时钟、设置...这仅显示用户安装的列表项。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多