ITmob-Ly
发布于 2021-12-14 / 891 阅读
0

适配 Android 11 (R) 的包可见性

Android11_header.JPG

QUERY_ALL_PACKAGES Added in API level 30

详见 Android Docs

如果应用以 Android 11(API 级别 30)或更高版本为目标平台(targetSDKVersion),并查询与设备上已安装的其他应用相关的信息,则系统在默认情况下会过滤此信息。

有限的应用可见性的影响

  • 获取其他应用相关信息的方法的返回结果,例如 queryIntentActivities()getPackageInfo()getInstalledApplications()

  • 有限的可见性还会影响与其他应用的显式交互,例如 启动另一个应用的服务/startService()

不受影响的情况/可见的应用

即使应用以 Android 11(API 级别 30)或更高版本为目标平台,以下类型的应用也始终对您的应用可见:

  1. 您自己的应用。
  2. 实现 Android 核心功能的某些系统软件包,例如媒体提供程序。
  3. 安装了您应用的应用。
  4. 使用 startActivityForResult() 方法在您的应用中启动 activity 的任何应用。
  5. 启动或绑定到您应用中的某项服务的任何应用。
  6. 访问您应用中的 Content Provider 的任何应用。
  7. 具有 Content Provider 的任何应用,其中您的应用已被授予 URI 权限来访问该 Content Provider
  8. 接收您应用的输入的任何应用。这种情况仅适用于您的应用作为输入法应用提供输入。
  9. 使用隐式或显式 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 过滤器签名。然后,您的应用就可以发现具有匹配的 <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 上发布,需要遵守它。