Android 6 及更高版本中的运行时权限让用户可以控制何时允许从设备的麦克风录制音频或从设备的相机录制视频。在应用可以录制之前,用户必须通过系统弹出的对话框授予或拒绝该权限。
Android 12 通过在应用通过相机和麦克风 应用操作权限 使用私有数据源时显示指示器,为用户提供透明度。应用操作会记录对运行时权限保护的 API 的访问。
应用操作会跟踪活动状态和各个 API 调用的数量,并与 Android 12 中的麦克风和相机指示器互动,以便在应用访问其设备上的音频和相机数据时向用户显示。当用户点击麦克风或相机指示器时,他们会看到哪些应用访问了他们的数据。所有 OEM 都必须使用此功能。
指示器可见性要求
以下是在运行 Android 12 或更高版本的设备上对麦克风和相机指示器的要求:
- 指示器必须显示在状态栏中,并保留最高的视觉优先级(例如,位于右上角的右侧位置)。
- 指示器必须始终位于同一位置,并且在应用启动时不得被应用遮挡。
- 两个指示器必须为绿色(或绿色的变体)。
- 点击一个或两个指示器必须呈现应用归因提示通知,该通知执行以下操作:
- 显示正在使用麦克风和(或)相机的应用的名称
- 显示在过去 15 秒内使用过麦克风和(或)相机的应用的名称
- 将用户转到设置中的应用权限页面
用法和功能
在 Android 12 中,UI 区分正在运行的用例和最近的用例。如果用例被系统标记为正在运行,或者用例存在时间不到 5 秒,则会被视为活跃用例。
- 状态栏图标会显示应用何时正在进行用户敏感的麦克风或摄像头访问。
- 用户可以点击这些图标,查看哪些应用正在访问麦克风、摄像头或两者都在访问。
图 1. 正在使用中的麦克风和摄像头指示器,显示活跃访问(右上角)
只要指示器显示,访问就被视为活跃。首先会显示一个图标,然后过渡到一个点,该点会持续存在,直到应用被关闭或关闭。
当用户打开“快捷设置”,然后点按指示器时,会弹出一个对话框,显示应用是否正在使用摄像头、麦克风或两者都在使用。
图 2. 活跃和最近访问指示器
图 2 中的图像显示了活跃访问指示器,此时正在运行的应用在过去 5 秒内访问过数据。
最近访问指示器显示,应用在之前的 15 秒内访问过数据,但该应用不是活跃应用。所有活跃应用都会在对话框中显示,但即使有多个应用在之前的 15 秒时间范围内访问过数据,也只会显示一个应用作为最近访问的来源。访问视图会保持冻结状态,直到用户关闭通知对话框。
交付和启用
PermissionManager
类提供了一种填充对话框的方法,该对话框位于 System UI 中。
- System UI 会对设备配置开关做出反应:
privacy/mic_camera_indicators_enabled
。 - 此开关是必要的,因为存在两个单独的交付途径,按以下顺序
- 交付。
- 启用。
- 如果
PermissionManager
中的方法无法提供所需的数据,则 System UI 不得崩溃。
流程
权限指示器功能包含三个主要部分
- 应用
- 指示器(由 SystemUI 处理)
- 一种确定哪些应用正在使用数据的方法
PermissionController
提供了确定哪些应用正在使用数据的机制。SystemUI 监听应用对私有数据的使用情况。SystemUI 在顶部导航栏中显示一个图标,该图标对应于使用的权限。PermissionController
在用户点击图标时显示关于用例的数据。
图 3. 系统组件和 (UI) 过渡流程
图 3 中的编号过渡如下所述
1- 应用从系统请求私有数据。
2- 系统检查权限。如果权限允许,系统会通知数据提供程序,并在 app-ops 中记录用例
3- 数据提供程序将数据提供给应用。
4-5 用户点击图标。System UI 从 PermissionManager
请求数据,并将对话框呈现给用户。
流程详情
- 应用使用麦克风和摄像头,调用
AppOpsManager.startOp
、stopOp
和(或)noteOp
。这会在系统服务器中创建 app-op 记录。 - System UI 使用
AppOpsManager.OnOpActiveChangedInternalListener
和OnOpNotedListener
监听器监听新的 app-ops。当新的用例传入时(通过调用startOp
或noteOp
),System UI 会验证该用例是否来自系统应用。 - 如果 System UI 验证系统应用用例,并且如果用例是针对麦克风的,则 System UI 会检查麦克风是否已静音。
- 如果 System UI 验证非系统应用用例(并且,对于麦克风用例,麦克风未静音;对于摄像头用例,摄像头已开启),则会显示一个反映此类用例的图标。
如果 System UI 收到 noteOp
(没有持续时间),则至少显示 5 秒钟的图标。否则,图标会一直显示,直到收到 stopOp
或持续 5 秒钟(以较长者为准)。用户点击图标会启动一个 intent,该 intent 会转到 PermissionController
以启动对话框。
PermissionController
加载麦克风和摄像头的所有近期用例。它会检查其中是否有任何用例正在运行,或者是否在 System UI 设置的时间范围内运行。如果找到匹配项,它会显示使用该权限的应用名称,以及应用使用的权限。
由于 Android 12 及更高版本中的这项更改,某些应用必须更改其行为或实现特殊行为。
电话服务必须实现权限用例(以考虑电话呼叫中使用的单独麦克风堆栈),同时与 Android Google Search 应用 (AGSA) 和 Google 移动服务 (GMS) 配合使用。