利用 Android 6 及更高版本中的运行时权限,用户可以控制何时允许通过设备麦克风录制音频或通过设备摄像头录制视频。用户必须先通过系统显示的对话框向应用授予或拒绝授予权限,然后应用才能录制。
在应用通过摄像头和麦克风应用操作权限使用专用数据源时,Android 12 会显示指示标志,以便用户了解此情况。应用操作记录对运行时权限保护的 API 的访问权限。
应用操作会跟踪 activity 状态和单个 API 调用的次数,并与 Android 12 中的麦克风和摄像头指示标志交互,以便在应用访问用户设备上的音频和摄像头数据时向用户显示。当用户点击麦克风或摄像头指示标志时,他们会看到哪些应用访问过其数据。所有 OEM 都必须启用此功能。
指示标志可见性要求
以下是搭载 Android 12 或更高版本的设备对麦克风和摄像头指示标志的要求:
- 指示标志必须显示在状态栏中,并保持在视觉上最显眼(例如,显示在右上角最右侧的位置)。
- 指示标志必须始终位于相同的位置,并且在启动时不得被应用阻止。
- 这两个指示标志必须采用绿色(或绿色的变体)。
- 点击其中一个或两个指示标志必须呈现执行以下操作的应用归因方式通知:
- 显示使用麦克风和/或摄像头的应用的名称
- 显示过去 15 秒内使用过麦克风和/或摄像头的应用的名称
- 将用户引导至设置中的应用权限页面
使用情况和功能
在 Android 12 中,界面会区分正在运行使用情况和近期使用情况。如果使用情况被系统标记为“正在运行”或使用时间少于 5 秒,则会被视为“有效”。
- 每当应用具有用户敏感的麦克风或摄像头访问权限时,就会显示状态栏图标。
- 用户可以点击这些图标,查看哪些应用正在使用麦克风和/或摄像头。
图 1. 麦克风和摄像头使用中指示标志表明访问权限有效(右上角)
只要指标标志显示,访问权限就会被视为有效。首先显示图标,然后转换为圆点,直到应用删除或关闭为止。
当用户点按指示标志时,会展开对话框,显示应用正在使用摄像头和/或麦克风。
图 2.有效和近期访问权限指示标志
图 2 中的图像显示了正在运行的应用在过去 5 秒内访问数据时的有效访问权限指示标志。
近期访问权限指示标志显示应用在过去 15 秒内访问过数据,但应用未处于活跃状态。对话框中会显示所有活跃应用,但只有一个应用显示为近期访问权限的来源,即使有多个应用在前 15 秒内访问过数据也是如此。除非用户关闭通知对话框,否则访问权限视图将保持冻结状态。
投放并启用
PermissionManager
类提供了用于填充对话框的方法,该对话框位于系统界面中。
- 系统界面会对设备配置开关做出反应:
privacy/mic_camera_indicators_enabled
。 - 这种切换是必要的,因为有两辆单独的送货车辆,按以下顺序排列:
- 投放。
- 启用。
- 如果
PermissionManager
中的方法无法提供所需的数据,系统界面不得崩溃。
处理流程
权限指示标志功能有三个主要部分:
- 应用
- 指示标志(由 SystemUI 处理)
- 确定哪些应用正在使用数据的方式
PermissionController
提供了确定哪些应用正在使用数据的机制。SystemUI 使用私有数据监听应用。SystemUI 会在顶部导航栏中显示与所用权限对应的图标。当用户点击某个图标时,PermissionController
会显示与使用情况相关的数据。
图 3. 系统组件和(界面)转换流程
图 3 中的编号转换如下所述:
1- 应用向系统请求私有数据。
2- 系统会检查权限。如果授予相应权限,系统会通知数据提供方,并在应用操作中记录使用情况
3- 数据提供方会向应用提供数据。
4-5 用户点击图标。系统界面从 PermissionManager
请求数据,并向用户呈现对话框。
处理详情
- 应用使用麦克风和摄像头,分别调用
AppOpsManager.startOp
、stopOp
和/或noteOp
。这将在系统服务器中创建应用操作记录。 - 系统界面使用
AppOpsManager.OnOpActiveChangedInternalListener
和OnOpNotedListener
监听器监听新的应用操作。出现新的用法(通过调用startOp
或noteOp
)时,系统界面会验证使用情况是否是通过系统应用。 - 如果系统界面验证了系统应用的使用情况,并且如果需要验证麦克风的使用情况,则系统界面会检查麦克风是否已静音。
- 如果系统界面验证非系统应用的使用情况(对于麦克风使用情况,麦克风未静音;对于摄像头使用情况,摄像头已开启),则会显示代表此类使用情况的图标。
如果系统界面收到未设置时长的 noteOp
,则会显示图标至少 5 秒。否则,此图标会显示,直到接收 stopOp
或显示 5 秒(以较短者为准)。用户点击图标会启动一个 intent,该 intent 会转到 PermissionController
以启动对话框。
PermissionController
会加载麦克风和摄像头的所有近期使用情况。它会检查其中任何一个是否正在运行,或是否正在系统界面所设置的时间范围内运行。如果找到匹配项,它会显示使用该权限的应用名称以及该应用使用的权限。
由于 Android 12 及更高版本中的这项变更,某些应用必须更改其行为或实现特殊行为。
在使用 Android Google 搜索应用 (AGSA) 和 Google 移动服务 (GMS) 时,Telephony 必须实现权限使用情况(以便将致电中单独的麦克风堆栈考虑在内)。