在 Android 10 及之前的版本中,应用可以通过 queryIntentActivities() 这样的方法获取到设备中所有已安装的应用列表。在大多数情况下,这种访问权限远超出了应用实际所需要的权限范围。随着我们不断加强对隐私保护的关注,我们将在 Android 11 上引入一些新的变化,从而改变应用查询用户已安装应用并与之交互的方式。为了达到这一目的,我们为特定设备上所安装的应用列表带来了更好的访问控制。
为了更好地 "问责" 访问已安装应用的行为,默认情况下,以 Android 11 为目标平台 (目标 API level 为 30) 的应用默认将只能检测到部分过滤后的已安装应用。如果想获取更多别的已安装应用列表信息,则需要在应用内的 Android manifest 中添加 <queries> 元素,从而拓宽访问范围。
在大部分常见场景下,包括任何以 startActivity() 启动的 intents,您不需要做任何改动。而其他场景,比如从您应用的界面中直接打开某个特定的第三方应用,则需要开发者们显式地声明应用的包名或者 intent filter 签名,如下所示:
<manifest package="com.example.game">
<queries>
<!-- 声明所要进行交互的应用名 -->
<package android:name="com.example.store" />
<package android:name="com.example.service" />
<!--
声明要查询的 intents
例如下列标签声明了一个自定义的分享视图的 intent
-->
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
大部分常见场景
https://developer.android.google.cn/preview/privacy/package-visibility#use-cases-not-affected
其他场景
https://developer.android.google.cn/preview/privacy/package-visibility-use-cases
intent filter 签名
h