根据《移动终端应用软件列表权限实施指南》规定,移动终端上用户的应用软件体现了用户兴趣、偏好、行为习惯等个人属性,可用来对用户进行画像分析,进而实现向用户定向推送、广告等业务,因此用户的「应用软件列表信息」属于敏感的个人信息,移动终端上的应用软件列表信息应谨慎使用。
基于上述政策背景,为保障用户的数据安全及隐私安全,小米在新版澎湃OS系统下,将加强对获取「应用软件列表信息」的管理。默认状态下,应用仅可查询以下类型应用的列表信息:「自己分发的应用」、「系统应用」、「声明清单内应用」。
- 「自己分发的应用」应用通过应用内曝光等方式分发安装了另一款应用,在该设备上被安装的应用属于前述应用分发的应用,在应用软件列表查询时自动可见。
- 「系统应用」详情可参照以下第3部分内容
- 「声明清单内应用」Android支持的packages标签的方式在应用清单中已声明的应用
一、「应用软件列表信息」的获取及使用
获取「应用软件列表信息」应当遵循合法、正当、最小数据必要原则,应用不得在非核心功能所必须或无合理场景下获取设备上已安装应用软件列表信息,若超出最小数据必要原则或不具备合理场景请勿获取。同时,若通过获取「应用软件列表信息」进行应用分发、安装等行为时,须明确告知用户,并获得用户的授权同意。以下为您提供了部分场景的适配标准,您需根据场景满足适配要求。
1、通用场景
1.1 交互场景
若在通用场景下,您的应用需查看其他软件包,获取「应用软件列表信息」时,依据最小数据必要原则,请使用 <queries>
元素声明您的应用需要提高软件包可见性,让上述应用对您的应用可见。交互场景包括:
场景 | 场景描述 |
分享 | 实现分享功能,用于确认是否已安装特定软件 |
支付 | 实现支付功能,用于确认是否已安装特定软件 |
第三方登录 | 实现第三方登录功能,用于确认是否已安装特定软件 |
地图 | 实现第三方地图的跳转,用于确认是否已安装特定软件 |
文件打开 | 应用需要处理文件或附件,例如需要检查设备能否打开给定文件 |
1.2 适配说明
- 按应用包名指定
您须明确要读取或与之交互的特定应用(例如,在分享、支付、第三方登录等场景下需要交互的应用),请将包名添加到清单文件的 <queries> 元素内的一组 <package> 元素中,根据标准要求,除某些通用场景下的特定应用,针对其他应用的声明数量请勿超过10个。
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
注意:如果您在应用的清单中声明了 <package>
元素,那么与该软件包名称关联的应用会出现在对 PackageManager
进行的任何与该应用的组件匹配的查询的结果中。
2、隐式跳转场景
2.1 交互场景
若您有隐式跳转规则的查询需求,例如跳转打开「邮箱」、「浏览器」等场景,请通过使用<queries>元素、<intent>元素的方式来满足。从而明确应用的交互行为,进一步保护用户的知情权和选择权。
2.2 适配说明
- 按 intent 过滤器指定
应用可能需要查询一组具有特定用途的应用或与之交互,但可能不知道要添加的具体应用包名。在这种情况下,可以在 <queries> 元素中列出 intent 过滤器。然后,应用就可以发现具有匹配的 <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 过滤器,包括且不限于:查询所有有 Launcher 的应用
<manifest package="com.example.game">
<queries>
<!-- 禁止预置此过滤器 -->
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent>
</queries>
...
</manifest>
3、系统应用跳转
系统会对部分应用自动可见,以便您的应用可与其交互,而无需声明 <queries>
元素。上述情况有助于满足并支持应用基本功能。
3.1 自动可见的应用类型
若您的应用版本为Android11及以上(Target SDK Version >=30),以下类型的应用自动对您的应用可见:
- 您自己的应用。
- 实现 Android 核心功能的某些系统软件包,例如媒体提供程序。
- 安装了您应用的应用。
- 使用
startActivityForResult()
方法在您的应用中启动 activity 的任何应用,正如如何获取 activity 的结果这一指南中所述。 - 启动或绑定到您应用中的某项服务的任何应用。
- 访问您应用中的 content provider 的任何应用。
- 具有 content provider 的任何应用,其中您的应用已被授予 URI 权限来访问该 content provider。
- 接收您应用的输入的任何应用。这种情况仅适用于您的应用作为输入法应用提供输入。
3.2 自动可见的系统软件包
1) 实现 Android 核心功能的某些系统软件包会自动对您的应用可见,即使您的应用版本为Android11及以上(Target SDK Version >=30)也是如此。
2) 自动可见的软件包列表查询
如需查看特定设备的完整软件包列表,请在开发机器上的终端中运行以下命令:adb shell dumpsys package queries
在命令输出中,找到 forceQueryable
部分。本部分包含设备上自动对您的应用可见的软件包列表。
二、联系我们
以上为您提供了部分场景的适配方案,若您有通过获取「应用软件列表权限」实现应用分发的需求,您可通过引导用户授权、开启「应用软件列表权限」的方式来实现,我们也为您提供了系统服务能力,您可通过「直投能力」(具体接入细则请参照《直投2.0接入技术文档》)来实现应用分发场景,满足应用分发需求;针对有拉活需求的应用,您可通过「拉活服务能力」(具体接入细则请参照《拉活服务技术接入文档》),从而实现拉活服务需求和场景。
此外,若您对“应用软件列表信息”获取有其他场景疑问,或有相关技术问题,可通过下述流程进入人工客服与我们取得联系;具体流程:
首先请您在进入人工客服后,输入“应用软件列表信息+问题反馈”关键词,为了能快速全面的帮您核实应用问题,您需提供以下信息:
- 包名+应用名称+版本号+APK链接
- 问题反馈原因
- 问题反馈详细内容
- 如您有相关证明材料来证明申请/问题反馈内容的合法性、安全性和合理性,请一并附上(包括但不限于证明申请/权威机构的安全性报告,详细的法律法规标准等)