QUERY_ALL_PACKAGESAdded in API level 30详见 Android Docs
如果应用以 Android 11(API 级别 30)或更高版本为目标平台(targetSDKVersion),并查询与设备上已安装的其他应用相关的信息,则系统在默认情况下会过滤此信息。
有限的应用可见性的影响
- 
获取其他应用相关信息的方法的返回结果,例如 queryIntentActivities()、getPackageInfo()和getInstalledApplications()。
- 
有限的可见性还会影响与其他应用的显式交互,例如 启动另一个应用的服务/startService()。
不受影响的情况/可见的应用
即使应用以 Android 11(API 级别 30)或更高版本为目标平台,以下类型的应用也始终对您的应用可见:
- 您自己的应用。
- 实现 Android 核心功能的某些系统软件包,例如媒体提供程序。
- 安装了您应用的应用。
- 使用 startActivityForResult()方法在您的应用中启动activity的任何应用。
- 启动或绑定到您应用中的某项服务的任何应用。
- 访问您应用中的 Content Provider的任何应用。
- 具有 Content Provider的任何应用,其中您的应用已被授予URI权限来访问该Content Provider。
- 接收您应用的输入的任何应用。这种情况仅适用于您的应用作为输入法应用提供输入。
- 使用隐式或显式 intent 来启动另一应用的 activity,无论这个应用是否对您的应用可见。
adb shell dumpsys package queries
# 找到 forceQueryable 部分。本部分包含设备上自动对您的应用可见的软件包列表。
适配方法/声明软件包可见性
1. 特定软件包名称
如果知道要查询或交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),将其软件包名称添加到 <queries> 元素内的一组 <package> 元素中:
<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>
注意:如果在应用的清单中声明了
<package>元素,则与该软件包名称关联的应用会出现在对PackageManager进行的任何与该应用的组件匹配的查询的结果中。
2. 与 intent 过滤器签名匹配的软件包
可能不知道要添加的具体包名称。在这种情况下,可以在 <intent-filter> 元素的应用。
以下示例允许您的应用看到支持 JPEG 图片共享功能的已安装应用:
<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>
<intent>元素有一些限制: 详见: Android Docs包可见性受限时用
Intent进行交互的常用方法,可参见 Android Docs
3. 使用特定授权的软件包
如果需要查询 Content Provider 但不知道具体的package名称,可以在 <provider> 元素中声明该提供授权,如以下代码段所示:
<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>
可以在一个 <queries> 元素中声明所有的程序授权。此格式取决于您声明提供程序授权的数量:
- 单个 元素 在元素中,声明以英文分号分隔的授权列表。 
- 多个 元素 在每个元素中,声明单项授权或以英文分号分隔的授权列表。 
4. 所有应用(不推荐)
如果 <queries> 元素无法提供合适的软件包可见性,还可以使用 QUERY_ALL_PACKAGES 权限。
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
但是为了尊重用户隐私,您的应用应请求应用正常工作所需的最小软件包可见性。
来自 Google Play 的政策更新为需要
QUERY_ALL_PACKAGES权限的应用提供了相关准则。
如果应用要在Google Play上发布,需要遵守它。