target31谷歌做了一些列的适配,其中对看似无关紧要的传感器采用率做了限制,最近几年很火的摇一摇开屏广告就是基于传感器去实现的。这篇文章,我们就一起去看一下target31对传感器采样频率的限制。
一、背景
先说一下背景:近期(其实也挺久了),谷歌公司发布了聚焦用户隐私保护的安卓12操作系统更新说明。在此次升级中,安卓系统除了对麦克风,摄像头等传感器进行了安全增强,还对加速计等看似与隐私无关的运动传感器制定了严格的使用规范,加强了对其高频传感数据的权限管理。究其原因在于加速度计等运动传感器已被证实可窃听手机通话!而这一重大发现来自浙江大学网络空间安全研究中心。
浙大的研究成果地址:浙大网安科研成果引发谷歌安卓操作系统隐私机制变革 - 浙江大学网络空间安全学院
二、采样率限制
基于以上的安全问题,谷歌在Android12(target31)对传感器的采样率做了严格的限制。目前Android开发者网站中文版已经没有该段内容,具体可以查看英文版传感器概览 | Android 开发者 | Android Developers
引用网上的翻译:
为了保护有关用户的潜在敏感信息,如果应用面向 Android 12(API 级别 31)或更高版本,系统会对来自某些运动传感器和位置传感器的数据的刷新率进行限制。该数据包括设备的accelerometer, gyroscope, 和geomagnetic field sensor.
刷新率限制取决于访问传感器数据的方式:
-
如果调用 registerListener() 方法监听传感器事件,传感器采样率限制为 200 Hz。
-
如果使用SensorDirectChannel 类,则传感器采样率被限制为 RATE_NORMAL,通常约为 50 Hz。
如果您的应用需要以更高的速率收集运动传感器数据,您必须声明 HIGH_SAMPLING_RATE_SENSORS 权限,如以下代码片段所示。否则,则会发生 SecurityException。
<manifest ...>
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>
<application ...>
...
</application>
</manifest>
三、为什么是200HZ
其实浙大的研究报告已经提到了:"从安全性角度来说,当运动传感器以200Hz的频率工作时,其能完整恢复的语音信号将限制在100Hz以下,而人类语音的信息主要存在于85Hz以上的频段,因此运动传感器能采集到的语音信息已相对较少。"
赫兹(HZ),是次数/秒的意思,1HZ = 1次/秒,那200HZ就是200次/秒,一次就是1/200 = 0.005秒。
我们再看下Android传感器对加速度的收集频率,以下是SENSOR_DELAY_FASTEST到SENSOR_DELAY_NORMAL的收集频率,单位是微秒,也就是xxx微秒收集一次:
0.005秒 = 0.005 * 1000 * 1000微秒 = 5000微秒,所以说,除了SENEOR_DELAY_FASTEST外,其他的三种采样率都可以使用。
四、其他注意事项
还需要注意的是,registerListener方法的最后一个参数是个可任意传入的int值,那如果传入的不是这四个枚举,那么会使用传入的值,也就是说,0-4999也是不能直接传入的。
如果传入0-4999的值,那么也会crash:
以上是对Android target31适配传感器的总结,其实在大多数的场景下,根本没必要去使用那么快的频率,使用DENSOR_DELAY_NORMAL或SENSOR_DELAY_UI就已经足够。