声明包可见性需求

在创建应用时,务必考虑设备上其他应用与您的应用需要交互的情况。如果您的应用以 Android 11(API 级别 30)或更高版本为目标,则系统会自动使某些应用对您的应用可见,但默认情况下会过滤掉其他应用。本指南介绍了如何使这些其他应用对您的应用可见。

如果您的应用以 Android 11 或更高版本为目标,并且需要与自动可见的应用之外的其他应用进行交互,请在应用的清单文件中添加<queries> 元素。在<queries> 元素中,指定其他应用按包名按意图签名按提供程序权限,如下面的部分所述。

特定包名

如果您知道要查询或与其交互的特定应用,例如与您的应用集成的应用或您使用的应用的服务,请将其包名包含在一组<package> 元素中,这些元素位于<queries> 元素内

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

在库中与主机应用通信

如果您开发 Android 库,则可以通过在AAR 清单文件 中添加<queries> 元素来声明您的包可见性需求。此<queries> 元素的功能与应用在其自己的清单中声明的元素相同。

如果您的库涉及与主机应用的通信,例如使用绑定服务,请包含一个<package> 元素,该元素指定主机应用的包名

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

通过包含此声明,您可以检查主机应用是否已安装并与其交互,例如通过调用bindService()。使用您的库的调用应用会自动对主机应用可见,这是此交互的结果。

与意图过滤器签名匹配的包

您的应用可能需要查询或与一组服务于特定目的的应用进行交互,但您可能不知道要包含的特定包名。在这种情况下,您可以在<queries> 元素中列出意图过滤器签名。然后,您的应用可以发现具有匹配<intent-filter> 元素的应用。

以下代码示例显示了一个<intent> 元素,该元素允许应用查看支持 JPEG 图像共享的其他已安装应用

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

<intent> 元素有一些限制

  • 您必须包含恰好一个<action> 元素。
  • 您不能在<data> 元素中使用pathpathPrefixpathPatternport 属性。系统会将其行为视为您将每个属性的值设置为通用通配符(*)。
  • 您不能使用<data> 元素的mimeGroup 属性。
  • 在一个<intent> 元素的<data> 元素内,您最多只能使用以下每个属性一次

    • mimeType
    • scheme
    • host

    您可以将这些属性分布在多个<data> 元素中,或者在一个<data> 元素中使用它们。

<intent> 元素支持通用通配符(*) 作为少数属性的值

  • <action> 元素的name 属性。
  • <data> 元素的mimeType 属性的子类型(image/*)。
  • <data> 元素的mimeType 属性的类型和子类型(*/*)。
  • <data> 元素的scheme 属性。
  • <data> 元素的host 属性。

除非在上一个列表中另有说明,否则系统不支持混合使用文本和通配符,例如prefix*

使用特定权限的软件包

如果您需要查询内容提供程序 但不知道特定的软件包名称,则可以在<provider> 元素中声明提供程序权限,如下面的代码片段所示

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

您可以在单个<queries> 元素中声明提供程序权限。在<queries> 元素内,您可以声明一个或多个<provider> 元素。<provider> 元素可以包含单个提供程序权限或以分号分隔的提供程序权限列表。

所有应用(不推荐)

在极少数情况下,您的应用可能需要查询或与设备上安装的所有应用进行交互,而与它们包含的组件无关。为了允许您的应用查看所有其他已安装的应用,系统提供了QUERY_ALL_PACKAGES 权限。

以下是一些包含QUERY_ALL_PACKAGES 权限的用例示例

  • 辅助功能应用
  • 浏览器
  • 设备管理应用
  • 安全应用
  • 防病毒应用

但是,通常可以通过与自动可见的应用集进行交互,并在清单文件中声明您的应用需要访问的其他应用来满足您的应用的用例。为了尊重用户隐私,您的应用应请求最少的软件包可见性以使您的应用能够正常工作。

Google Play 的政策更新 为需要QUERY_ALL_PACKAGES 权限的应用提供了指南。