Android 11 中的软件包可见性
Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用新的 <queries>
元素,应用可以定义一组自身可访问的其他应用。通过告知系统应向您的应用显示哪些其他应用,此元素有助于鼓励最小权限原则。此外,此元素还可帮助 Google Play 等应用商店评估应用为用户提供的隐私权和安全性。
如果应用以 Android 11 为目标平台,您可能需要在应用的清单文件中添加 <queries>
元素。在 <queries>
元素中,您可以按软件包名称或按 intent 签名指定应用。
注意:在某些情况下,即使您的应用以 Android 11 为目标平台,您也根本不需要更新自己的应用来支持这一变更。
返回其他应用相关结果的PackageManager
方法(如queryIntentActivities()
)会根据发起调用的应用的<queries>
声明进行过滤。与其他应用的显式交互(如startService()
)还要求目标应用与<queries>
中的某项声明相符。
设置您的环境
如需构建使用 <queries>
元素的应用,请使用以下工具:
- Android Studio 3.6.1 或更高版本
- 最新版本的 Android Gradle 插件
查询特定软件包及与之交互
如果您知道要查询或与之交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),请将其软件包名称添加到 <queries>
元素内的一组 <package>
元素中:
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
在给定 intent 过滤器的情况下查询应用及与之交互
您的应用可能需要查询一组具有特定用途的应用或与之交互,但您可能不知道要添加的具体软件包名称。在这种情况下,您可以在 <queries>
元素中列出 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>
元素有一些限制:
- 您必须只添