与位置、麦克风和相机相关的权限允许您的应用访问有关用户的特别敏感信息。 平台包含几个机制(在本页中介绍)来帮助用户了解并控制哪些应用可以访问位置、麦克风和相机。
只要您 遵循隐私最佳实践,这些保护隐私的系统功能就不会影响您的应用如何处理与位置、麦克风和相机相关的权限。
特别地,请确保在您的应用中执行以下操作
- 在用户向您的应用授予
CAMERA
权限之前,请勿访问设备的相机。 - 在用户向您的应用授予
RECORD_AUDIO
权限之前,请勿访问设备的麦克风。 - 在您的应用中,请等待用户与需要位置信息的特性进行交互,然后再请求
ACCESS_COARSE_LOCATION
权限或ACCESS_FINE_LOCATION
权限,如关于如何 请求位置权限 的指南中所述。 - 在您请求
ACCESS_BACKGROUND_LOCATION
权限之前,请等待用户授予您的应用ACCESS_COARSE_LOCATION
权限或ACCESS_FINE_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);