Android NDK开发详解权限之解释对比较敏感信息的访问权限

在授予应用与位置信息、麦克风和相机相关的权限后,应用可以访问关于用户的特别敏感的信息。该平台包含多种机制(如本文所述),可帮助用户及时了解和控制哪些应用可以访问位置信息、麦克风和相机。

这些隐私保护系统功能应该不会影响您的应用处理与位置信息、麦克风和相机相关的权限的方式,但前提是您遵循隐私设置最佳做法。

具体来说,请确保在对应用执行相关操作时做到以下几点:

等到用户向您的应用授予 CAMERA 权限后再使用设备的相机。
等到用户向您的应用授予 RECORD_AUDIO 权限后再使用设备的麦克风。
等到用户与您应用中某项需要获取位置信息的功能互动后再请求 ACCESS_COARSE_LOCATION 权限或 ACCESS_FINE_LOCATION 权限,如介绍如何请求位置信息权限的指南中所述。
等到用户向您的应用授予 ACCESS_COARSE_LOCATION 权限或 ACCESS_FINE_LOCATION 权限后再请求 ACCESS_BACKGROUND_LOCATION 权限。

隐私信息中心

垂直时间轴显示了访问过位置信息的不同应用,以及访问发生的时间
在这里插入图片描述

图 1. “位置信息使用情况”屏幕,“隐私信息中心”的一部分。

在搭载 Android 12 或更高版本的受支持设备上,系统设置中会显示“隐私信息中心”屏幕。在此屏幕上,用户可以访问一些单独的屏幕,这些屏幕显示了应用何时访问位置信息、相机和麦克风信息。每个屏幕都会显示一个时间轴,指明不同的应用何时访问过特定类型的数据。图 1 显示了位置信息的数据访问时间轴。

显示数据访问的理由

您的应用可以向用户提供一个理由,帮助他们了解为什么您的应用访问位置信息、相机或麦克风信息。此理由可以显示在新的“隐私信息中心”屏幕和/或您应用的权限屏幕上。

如需解释为什么您的应用访问位置信息、相机和麦克风信息,请完成以下步骤:

添加一个 activity,它在启动后会提供某种理由,说明为什么您的应用执行特定类型的数据访问操作。在此 activity 中,将 android:permission 属性设置为 START_VIEW_PERMISSION_USAGE。

如果您的应用以 Android 12 或更高版本为目标平台,您必须明确地为 android:exported 属性定义一个值。

向新添加的 activity 添加以下 intent 过滤器:
    <!-- 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>
决定您的数据访问理由 activity 应显示什么内容。例如,您可以显示应用的网站或帮助中心文章。如需提供更详细的解释来说明您的应用访问的数据类型以及访问发生的时间,请处理系统在调用权限使用 intent 时包含的 extra:
    如果系统调用 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 的值。

根据您添加的 intent 过滤器,用户会在某些屏幕上看到应用的名称旁边有一个信息图标:

如果您添加包含 VIEW_PERMISSION_USAGE 操作的 intent 过滤器,用户会在系统设置中的应用权限页面上看到该图标。您可以将该操作应用于所有运行时权限。
如果您添加包含 VIEW_PERMISSION_USAGE_FOR_PERIOD 操作的 intent 过滤器,每当您的应用显示在“隐私信息中心”屏幕中,用户都会在应用的名称旁边看到该图标。

当用户选择该图标时,系统会启动应用的理由 activity。
右上角的圆角矩形,其中包含相机图标和麦克风图标
图 2. 麦克风和摄像头指示标志,显示了最近的数据访问。

指示标志

注意:本部分提到的图标不应要求更改应用的逻辑,前提是您遵循隐私设置最佳做法。
在这里插入图片描述

在搭载 Android 12 或更高版本的设备上,当应用使用麦克风或相机时,图标会出现在状态栏中。如果应用处于沉浸模式,图标会出现在屏幕的右上角。用户可以打开“快捷设置”,并选择图标以查看哪些应用当前正在使用麦克风或摄像头。图 2 显示了包含图标的示例屏幕截图。

确定指示标志在屏幕上的位置

如果您的应用支持沉浸模式或全屏界面,指示标志可能会与应用界面短暂重叠。为协助应用界面适应这些指示标志,系统引入了 getPrivacyIndicatorBounds() 方法,如下方的代码段所示。利用此 API,您可以确定指示标志可能出现的边界。然后,您可能会决定以不同的布局安排屏幕界面。
Kotlin

view.setOnApplyWindowInsetsListener { view, windowInsets ->
    val indicatorBounds = windowInsets.getPrivacyIndicatorBounds()
    // change your UI to avoid overlapping
    windowInsets
}

切换开关

注意:本部分提到的切换开关不应要求更改应用的逻辑,前提是您遵循隐私设置最佳做法。
快捷设置图块标有“摄像头使用权限”和“麦克风使用权限”
图 3. “快捷设置”中的麦克风和摄像头切换开关。

在搭载 Android 12 或更高版本的受支持设备上,用户可以通过按一个切换开关选项,为设备上的所有应用启用和停用摄像头和麦克风使用权限。用户可以从快捷设置访问可切换的选项(如图 3 所示),也可以从系统设置中的“隐私设置”屏幕访问。
在这里插入图片描述

摄像头和麦克风切换开关会影响设备上的所有应用:

当用户关闭摄像头访问权限后,您的应用会收到空白的摄像头画面。

当用户关闭麦克风使用权限后,您的应用会收到无声音频。此外,无论您是否声明 HIGH_SAMPLING_RATE_SENSORS 权限,移动传感器都有采样率限制。
注意:当用户拨打应急服务电话(如 911)时,系统会开启麦克风使用权限。此行为可保护用户安全。

当用户关闭摄像头或麦克风的使用权限,然后启动需要使用摄像头或麦克风信息的应用时,系统会提醒用户,设备范围的切换开关已关闭。

检查设备支持情况

如需检查设备是否支持麦克风和摄像头切换开关,请添加以下代码段中所示的逻辑:
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);

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-03-30。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值