隐私指标

Android 6 及更高版本中的运行时权限允许用户控制何时允许录制来自设备麦克风的音频或来自设备摄像头的视频。在应用程序可以录制之前,用户必须通过系统显示的对话框授予或拒绝它的权限。

当应用通过摄像头和麦克风应用操作权限使用私有数据源时,Android 12 会显示指示器,从而为用户提供透明度。 App-ops 记录对运行时权限保护的 API 的访问。

App-op 跟踪活动状态和单个 API 调用的数量,并与 Android 12 中的麦克风和摄像头指示器交互,以在应用访问其设备上的音频和摄像头数据时向用户显示。当用户单击麦克风或摄像头指示器时,他们会看到哪些应用访问了他们的数据。此功能对于所有 OEM 都是强制性的。

指标可见性要求

以下是运行 Android 12 或更高版本的设备上麦克风和摄像头指示灯的要求:

  • 指示器必须出现在状态栏中,并保持最高的视觉优先级(例如,位于右上角的最右边)。
  • 指示器必须始终位于同一位置,并且在启动时不得被应用程序阻止。
  • 两个指示器的颜色必须为绿色(或绿色的变体)。
  • 单击一个或两个指示器必须呈现应用程序属性提示通知,该通知执行以下操作:
    • 显示正在使用麦克风和(或)摄像头的应用程序的名称
    • 显示在过去 15 秒内使用麦克风和(或)摄像头的应用程序的名称
    • 将用户带到“设置”中的应用权限页面

用途和特点

在 Android 12 中,UI 区分正在运行的使用情况和最近的使用情况。如果使用被系统标记为“正在运行”,或者使用时间少于 5 秒,则认为它们是“活动的”。

  • 每次应用程序具有持续的用户敏感麦克风或摄像头访问权限时,都会显示状态栏图标。
  • 用户可以单击这些图标并查看哪些应用程序正在访问麦克风、摄像头或两者。

Microphone and camera in-use indicators showing that access is active

图 1.显示活动访问的麦克风和摄像头使用中指示器(右上角)

只要指示器显示,访问就被认为是有效的。首先显示一个图标,然后过渡到一个持续存在的点,直到应用程序被关闭或关闭。

当用户点击指示器时,会打开一个对话框,显示应用当前正在使用摄像头、麦克风或两者。

Indicators for both active and recent access, and whether the access was from camera or microphone

图 2.活动和最近访问指标

图 2中的图像显示了过去 5 秒内正在运行的应用程序访问数据时的活动访问指示器。

最近访问指示器显示应用程序在前 15 秒内访问了数据,但该应用程序未处于活动状态。所有活动的应用程序都会显示在对话框中,但只有一个应用程序显示为最近访问的来源,即使超过 1 个应用程序在之前的 15 秒时间范围内访问了数据。访问视图保持冻结状态,直到用户关闭通知对话框。

交付和启用

PermissionManager类提供了一种填充对话框的方法,该对话框位于系统 UI 中。

  • 系统 UI 对设备配置开关做出反应: privacy/mic_camera_indicators_enabled
  • 切换是必要的,因为有两个单独的交付车辆,按以下顺序:
    1. 递送。
    2. 使能够。
  • 如果PermissionManager中的方法无法提供所需的数据,则系统 UI 不得崩溃。

工艺流程

权限指示器功能具有三个主要部分:

  • 应用程序
  • 指标(由 SystemUI 处理)
  • 一种确定哪些应用程序正在使用数据的方法

PermissionController提供了确定哪些应用程序正在使用数据的机制。 SystemUI 使用私有数据侦听应用程序。 SystemUI 在顶部导航栏中显示一个图标,该图标对应于所使用的权限。当用户单击图标时, PermissionController会显示有关使用情况的数据。

Process flow for Permission Indicator functions

图 3.系统组件和 (UI) 转换流程

图 3中的编号转换如下所述:

1-应用程序向系统请求私有数据。

2-系统检查权限。如果权限允许,系统会通知数据提供者,并在 app-ops 中注明使用情况

3-数据提供者向应用程序提供数据。

4-5用户点击图标。系统 UI 从PermissionManager请求数据并将对话框呈现给用户。

流程详情

  1. 应用程序使用麦克风和摄像头,调用AppOpsManager.startOpstopOp和(或) noteOp 。这会在系统服务器中创建 app-op 记录。
  2. 系统 UI 使用AppOpsManager.OnOpActiveChangedInternalListenerOnOpNotedListener侦听器侦听新的应用操作。当有新的用法出现时(通过调用startOpnoteOp ),系统 UI 会验证该用法是由系统应用程序使用的。
  3. 如果系统 UI 验证系统应用程序的使用情况,并且如果使用的是麦克风,则系统 UI 会检查麦克风是否已静音。
  4. 如果系统 UI 验证了非系统应用程序的使用情况(并且,对于麦克风使用情况,麦克风未静音;对于摄像头使用情况,摄像头已打开),它会显示一个反映此类使用情况的图标。

如果 System UI 收到一个没有持续时间的noteOp ,它会显示该图标至少 5 秒。否则,图标将显示直到收到stopOp或 5 秒,以较长者为准。用户单击图标会启动一个意图,该意图会转到PermissionController以启动对话框。

PermissionController加载麦克风和摄像头的所有最近使用情况。它检查其中是否有任何当前正在运行,或者是否在系统 UI 设置的时间范围内运行。如果找到匹配项,则会显示使用该权限的应用程序的名称,以及该应用程序使用了哪些权限。

由于 Android 12 及更高版本中的这一变化,一些应用必须改变其行为或实现特殊行为。

Telephony 在使用 Android Google Search 应用程序 (AGSA) 和 Google 移动服务 (GMS) 时,必须实现权限使用(以说明电话中使用的单独麦克风堆栈)。