使用 PackageManager 不会在 Android 11 上填充应用列表

2023-12-08

我正在使用包管理器来获取启动器中应用程序抽屉界面的应用程序列表。一切正常,但在 Android 11 上,唯一显示的应用程序是 Android 设置应用程序。是什么改变了它不再工作和/或我应该做什么才能使它工作?应用程序列表现在基于用户配置文件吗?

这是我当前的列表代码

public static List<ApplicationInfo> getPrimaryApps(Context context) {    
    PackageManager pm = context.getPackageManager();    
    List<ApplicationInfo> res = new ArrayList<>();    
    ArrayList<String> hiddenPackages = new ArrayList<>();    
    IconPackHelper iconPackHelper = IconPackHelper.getInstance(context);

    //All Apps Package Filter    
    Set<String> filteredPackages = new HashSet<>();

    filteredPackages.add("com.android.wallpaper.livepicker");    
    filteredPackages.add("com.gocalsd.symphlyx");

    //All Apps Blacklist    
    String[] flattenedPackages = SettingsProvider.get(context).getString(SettingsProvider.HIDDEN_APPS, "").split("\\|");

    for (String flat : flattenedPackages) {    
        ComponentName cmp = ComponentName.unflattenFromString(flat);    
        if (cmp != null) {
            hiddenPackages.add(cmp.getPackageName());

        }    
    }

    Intent intent = new Intent(Intent.ACTION_MAIN, null);    
    intent.addCategory(Intent.CATEGORY_LAUNCHER);   
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);

    //Sort all apps    
    Collections.sort(resolveInfoList, new ResolveInfo.DisplayNameComparator(pm));

    for (ResolveInfo resolveInfo : resolveInfoList) {    
        ActivityInfo activityInfo = resolveInfo.activityInfo;
        int iconId = IconPackHelper.getInstance(context).getResourceIdForActivityIcon(activityInfo);
        if (!filteredPackages.contains(resolveInfo.activityInfo.packageName)) {    
            if (!hiddenPackages.contains(resolveInfo.activityInfo.packageName)) {    
                String appName = activityInfo.applicationInfo.loadLabel(pm).toString();     
                String packageName = activityInfo.packageName;    
                Drawable icon = null;  
                int extractedIconColor = 0;
                //toggle themed icon    
                if (iconPackHelper.isIconPackLoaded() && iconPackHelper.getThemedIcon(context, packageName)) {    
                    if (iconId != 0) {    
                        icon = IconPackHelper.getInstance(context).getIconPackResources().getDrawable(iconId); 
                        Bitmap iconBm = ImageUtils.drawableToBitmap(icon);    
                        extractedIconColor = ColorProvider.getDominantColor(iconBm);    
                    }    
                }
                if (icon == null || !IconPackHelper.getInstance(context).isIconPackLoaded()) {  
                    icon = activityInfo.applicationInfo.loadIcon(pm);
                    Bitmap iconBm = ImageUtils.drawableToBitmap(icon);
                    extractedIconColor = ColorProvider.getDominantColor(iconBm);
                }
                res.add(new ApplicationInfo(appName, icon, packageName, extractedIconColor));
            }
        }
    }

    return res;

}

在Android 11中,我们可以看到很多改善隐私的更新。如果您的应用程序使用PackageManager方法来获取用户设备中已安装应用程序的列表,您必须对使用 Android 11 的设备的代码进行一些更改。

现在,对于使用 Android 11 的用户,代码保持不变,但除非您在AndroidManifest

有 3 种不同的方式查询已安装的应用程序

1.查询具体包

如果您已经知道要查询哪些应用程序,只需在<queries>中的元素AndroidManifest.

<manifest package="com.nd1010.app">
    <queries>
        <package android:name="com.fake.app" /> //replace with com.android.wallpaper.livepicker
        <package android:name="com.fake.game" /> //replace with com.gocalsd.symphlyx
    </queries>
    ...
</manifest>

2.使用intent过滤器进行查询

如果您不知道要查询的应用程序的所有包名称,但有一组具有类似功能的应用程序要查询,那么您可以在<queries>根据您的要求添加元素,就像下面的代码片段中所做的那样。

<manifest package="com.nd1010.app">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

The <intent>元素看起来很像,但几乎没有什么区别。<intent>元素有以下限制:

  • The <intent>元素只能有一个<action>元素。
  • The <data>元素只能具有以下属性:mimeType, scheme and host.

3.查询所有应用

如果您想像之前那样查询用户的所有应用程序,则需要包括QUERY_ALL_PACKAGES的许可AndroidManifest。这是一个正常的权限,一旦安装应用程序就会被授予。

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

理想情况下,人们应该请求最少数量的包裹并尊重用户的隐私。在大多数情况下,不需要此权限,只有对于像启动器这样的应用程序,才需要向用户请求查询手机上所有已安装应用程序的权限。

我在探索时注意到一个漏洞<queries>元素,如果添加android.intent.action.MAIN作为意图过滤器中的操作元素,您可以在不添加权限的情况下看到用户的几乎所有应用程序,因为几乎所有应用程序都会在意图过滤器中包含此元素AndroidManifest.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PackageManager 不会在 Android 11 上填充应用列表 的相关文章

随机推荐

  • 如何识别图片中的钞票?

    我有一些欧元钞票的图片 账单完全在图像内 并且大多是平坦的 例如变形很小 并且透视倾斜很小 例如完全从钞票上方拍摄的图像 现在我不是图像识别方面的专家 我想实现以下目标 找到钞票的边界框 这样我就可以从图像其余部分的噪声中 剪掉 钞票 弄清
  • Java Graphics2D浮点精确drawOval替代品?

    因此 我尝试绘制一个圆弧并在其圆形端点周围放置一个圆 但由于舍入到最近的像素 我遇到了问题 这在某些情况下是可见的 但并非在所有情况下都是可见的 有没有办法使用浮点和抗锯齿来绘制圆来消除这种舍入误差 您可以运行此代码来查看问题 为了清晰起见
  • max深度和min深度如何与find命令一起使用?

    我想知道最大深度和最小深度如何与 find 命令一起使用 还想知道下面的命令是如何工作的 find mindepth 2 maxdepth 5 name file1 根据find 的手册页 maxdepth levels Descend a
  • 比较 Timer 与 DispatcherTimer

    有什么区别between System Windows Forms Timer and System Windows Threading DispatcherTimer 在什么情况下我们应该使用它们 有什么最佳实践吗 Windows For
  • 使用 h5py 打乱 HDF5 数据集

    我有一个很大的 HDF5 文件 30GB 我需要对每个数据集中的条目 沿着 0 轴 进行洗牌 浏览 h5py 文档我也找不到randomAccess or shuffle功能 但我希望我错过了一些东西 有谁足够熟悉 HDF5 来想出一种快速
  • 请求权限对话框暂停我的活动

    我在里面请求许可onActivityResult我的活动的情况 发生的情况是我的活动在显示请求权限对话框时被暂停 这是为什么 我能以某种方式阻止它吗 我所做的只是以正常方式请求许可 if Build VERSION SDK INT gt B
  • EF Core 3.1.14 重复冷启动

    我们已将一个非常简单的 NET CORE 3 Web API 应用程序部署到 Azure 云 该应用程序是一个 Web API 并与 Azure 中托管的一个非常简单的 SQL 服务器数据库进行通信 我们注意到两个主要的性能问题 所有 AP
  • 替换R中矩阵中的非对角元素(希望这次问得更好)[重复]

    这个问题在这里已经有答案了 好吧 我早些时候问过这个问题 但我因为没有指定任何内容并且没有显示出之前尝试的迹象而受到了 理应的 批评 所以让我再试一次 I m using R and I have a 463 463 matrix What
  • 处理来自多个选择字段的数据

    我有一个多重选择字段 设计如下
  • 编辑多个未发布的 Go 模块的本地副本

    是只有我一个人还是使用未发布的 go 模块非常痛苦 https go dev doc modules managing dependency tmp 9 https groups google com g golang nuts c 9Mf
  • 如何访问 Apexchart 的 dataPointSelection 函数上的值

    如何通过单击工具提示来访问 Apex 图表的数据值 我不想要索引 我需要这个值 我如何访问该值
  • 流口水基于时间的限制和“现在”

    我们正在尝试写一个流口水 上面写着 如果事件发生在上周 则执行后果 我们有表示事件发生时间的常规 java 日期对象 但我们不确定如何在流口水的 LHS 中表达我们希望该日期对象在上周发生 重要的是 一周的时间跨度是任意的 它可以随时更改为
  • Matlab使用bar时右侧有空白

    我使用下面的代码来保存图形 fig1 figure visible off b bar bar res x a b c d e f g h i j k l m n o p q r s t u set gca XTickLabel x XTi
  • 如何最好地实现自定义类型的 Equals?

    假设有一个 Point2 类 并且以下等于 public override bool Equals object obj public bool Equals Point2 obj 这是 Effective C 3 中所示的内容 publi
  • ASP 奇怪的未指定错误 - 80004005

    我必须在一个已经制作好的网站上工作 只需添加一些小模块 当我更新时 不同的子文件夹中有许多名为 myDB mdb 的文件 我想确保我的应用程序连接正确的数据库 所以我开始重命名子文件夹 在其中一个子文件夹中 我刷新了 主站点和我的停止工作
  • Zend Framework 2 过滤/验证内容数组

    如何将过滤器应用于包含数组内容的字段元素 例如 this gt add name gt tags type gt text filter gt array array name gt StripTags array name gt Stri
  • 如何将值从一个 JLabel 传输到另一个 JLabel?

    我有这个计算器 但我不知道如何获取其中的值resultpane单击 完成 按钮时到第一个文本框 我是 Java 新手 我已经尝试这样做 但我一直收到错误 import java awt BorderLayout import java aw
  • My SQL 错误:连接尝试失败,因为连接方未正确响应

    我在第三方服务器中有一个 MySQL 数据库 我正在尝试使用 Dreamweaver 中的 PHP 从本地计算机访问它 但是 我收到以下错误 MySQL 错误 2002 连接尝试失败 因为连接方未正确响应 一段时间后 或建立连接失败 因为连
  • 如何在 XSL 中用空格替换逗号

    我需要在 XML 输出中将所有其他逗号替换为空格 现在 我的纬度和经度如下所示 0 52437106918239 0 391509433962264 0 533805031446541 0 430817610062893 0 0 54795
  • 使用 PackageManager 不会在 Android 11 上填充应用列表

    我正在使用包管理器来获取启动器中应用程序抽屉界面的应用程序列表 一切正常 但在 Android 11 上 唯一显示的应用程序是 Android 设置应用程序 是什么改变了它不再工作和 或我应该做什么才能使它工作 应用程序列表现在基于用户配置