与位置、麦克风和摄像头相关的权限允许您的应用访问有关用户的特别敏感信息。平台包含此页面中描述的几种机制,以帮助用户随时了解并控制哪些应用可以访问位置、麦克风和摄像头。
只要您遵循隐私最佳实践,这些保护隐私的系统功能就不会影响您的应用如何处理与位置、麦克风和摄像头相关的权限。
特别是,请确保您的应用执行以下操作
- 等到用户向您的应用授予
CAMERA
权限后,再访问设备的摄像头。 - 等到用户向您的应用授予
RECORD_AUDIO
权限后,再访问设备的麦克风。 - 等到用户与您的应用中需要位置的某个功能进行交互后,再请求
ACCESS_COARSE_LOCATION
权限或ACCESS_FINE_LOCATION
权限,如有关如何请求位置权限的指南中所述。 - 等到用户向您的应用授予
ACCESS_COARSE_LOCATION
权限或ACCESS_FINE_LOCATION
权限后,再请求ACCESS_BACKGROUND_LOCATION
权限。
隐私信息中心
在运行 Android 12 或更高版本的受支持设备上,隐私信息中心屏幕会出现在系统设置中。在这个屏幕上,用户可以访问单独的屏幕,这些屏幕显示应用何时访问位置、摄像头和麦克风信息。每个屏幕都会显示不同应用访问特定类型数据的时间线。图 1 显示了位置信息的数据访问时间线。
显示数据访问的理由
您的应用可以为用户提供理由,以帮助他们了解您的应用为何访问位置、摄像头或麦克风信息。此理由可以显示在新隐私信息中心屏幕、应用的权限屏幕或两者上。
要解释您的应用为何访问位置、摄像头和麦克风信息,请完成以下步骤
添加一个活动,该活动在启动时会提供一些理由来解释您的应用为何执行特定类型的数据访问操作。在此活动中,将
android:permission
属性设置为START_VIEW_PERMISSION_USAGE
。如果您的应用面向 Android 12 或更高版本,则必须显式定义
android:exported
属性的值。将以下意图过滤器添加到新添加的活动中
<!-- android:exported required if you target Android 12. --> <activity android:name=".DataAccessRationaleActivity" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:exported="true"> <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on your app permission's page in system settings. VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information icon on the Privacy Dashboard screen. --> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" /> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" /> <category android:name="android.intent.category.DEFAULT" /> ... </intent-filter> </activity>
确定您的数据访问理由活动应显示的内容。例如,您可以显示您的应用网站或帮助中心文章。要提供有关您的应用访问的数据类型以及访问发生时间的更详细说明,请处理系统在调用权限使用意图时包含的额外信息
- 如果系统调用
ACTION_VIEW_PERMISSION_USAGE
,您的应用可以检索EXTRA_PERMISSION_GROUP_NAME
的值。 - 如果系统调用
ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD
,您的应用可以检索EXTRA_PERMISSION_GROUP_NAME
、EXTRA_ATTRIBUTION_TAGS
、EXTRA_START_TIME
和EXTRA_END_TIME
的值。
- 如果系统调用
根据您添加的意图过滤器,用户会在某些屏幕上看到应用名称旁边的信息图标
- 如果您添加包含
VIEW_PERMISSION_USAGE
操作的意图过滤器,用户会在系统设置中应用的权限页面上看到该图标。您可以将此操作应用于所有运行时权限。 - 如果您添加包含
VIEW_PERMISSION_USAGE_FOR_PERIOD
操作的意图过滤器,则每当您的应用出现在隐私信息中心屏幕上时,用户都会在应用名称旁边看到该图标。
当用户选择该图标时,会启动应用的理由活动。
指示器
在运行 Android 12 或更高版本的设备上,当应用访问麦克风或摄像头时,状态栏中会出现一个图标。如果应用处于沉浸式模式,则该图标会出现在屏幕的右上角。用户可以打开快速设置并选择该图标以查看当前哪些应用正在使用麦克风或摄像头。图 2 显示了一个包含这些图标的示例屏幕截图。
识别指示器的屏幕位置
如果您的应用支持沉浸式模式或全屏 UI,指示器可能会暂时与您的应用 UI 重叠。为了帮助您调整 UI 以适应这些指示器,系统引入了getPrivacyIndicatorBounds()
方法,如下面的代码片段所示。使用此 API,您可以识别指示器可能出现的边界。然后,您可以决定以不同的方式组织屏幕的 UI。
Kotlin
view.setOnApplyWindowInsetsListener { view, windowInsets -> val indicatorBounds = windowInsets.getPrivacyIndicatorBounds() // change your UI to avoid overlapping windowInsets }
切换开关
在运行 Android 12 或更高版本的支持的设备上,用户可以通过按下单个切换开关选项来启用和禁用设备上所有应用的摄像头和麦克风访问权限。用户可以从快速设置(如图 3 所示)或系统设置中的隐私屏幕访问可切换选项。
摄像头和麦克风切换开关会影响设备上的所有应用
- 当用户关闭摄像头访问权限时,您的应用会收到空白的摄像头画面。
当用户关闭麦克风访问权限时,您的应用会收到静音音频。此外,运动传感器会被限速,无论您是否声明了
HIGH_SAMPLING_RATE_SENSORS
权限。
当用户关闭摄像头或麦克风的访问权限,然后启动需要访问摄像头或麦克风信息的应用时,系统会提醒用户设备范围的切换开关已关闭。
检查设备支持
要检查设备是否支持麦克风和摄像头切换开关,请添加以下代码片段中显示的逻辑
Kotlin
val sensorPrivacyManager = applicationContext .getSystemService(SensorPrivacyManager::class.java) as SensorPrivacyManager val supportsMicrophoneToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.MICROPHONE) val supportsCameraToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.CAMERA)
Java
SensorPrivacyManager sensorPrivacyManager = getApplicationContext() .getSystemService(SensorPrivacyManager.class); boolean supportsMicrophoneToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.MICROPHONE); boolean supportsCameraToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.CAMERA);