手机中的计步器是怎么实现的,是怎样具体收集这些信息的
计步器读取手机传感器(读取三轴陀螺仪数据)收集的数据,进行二次解读和算法的过程。因为行走时人体做垂直运动,就会有个加速度,检测加速度峰值从而记步。至于准确与否取决于传感器灵敏度及软件分析
重力传感器:
原理:利用压电效应实现,传感器内部一块重物和压电片整合在一起,通过正交两个方向产生的电压大小,来计算出水平方向。
用途:手机横竖屏智能切换、拍照照片朝向、重力感应类游戏(如滚钢珠)。
加速度传感器
原理:与重力传感器相同,也是压电效应,通过三个维度确定加速度方向,但功耗更小,但精度低。
用途:计步、手机摆放位置朝向角度。
个人使用过魅族MX4、PRO6,两款都支持计步。华为P7不支持计步。从参数上看,计步功能是霍尔传感器的功劳?
P7:重力感应器,光线传感器,距离传感器,陀螺仪
MX4:重力感应器,光线传感器,触摸感应器,环境色温感应器,霍尔磁感应器,红外距离感应器,陀螺仪,电子罗盘
PRO6:霍尔磁感应、 重力感应、红外距离感应、陀螺仪、环境光度感应、触摸感应、电子罗盘、气压计(支持高度)
拿陀螺仪计步的是比较低级的计步功能,具体表现就是把手机拿在手里摇一摇也会计步。
高级一些的是拿“加速度计”来采集数据,准确度会有所提高。当然最好的还是两者结合使用,单独使用各有利弊。
多说一点:安卓手机因为系统原因,锁屏的时候可能将后台的进程(应用)杀死,所以有时候锁屏的时候,没有计上就是这个原因。其实手机计步器也没有什么特殊的,它只是在手机中作为一类传感器进行使用,下面给你列出计步算法相关的传感器:
1、Sensor_ TYPE_ACCELEROMETER
加速度传感器,单位是m/s2,测量应用于设备X、Y、Z轴上的加速度
传感器类型值(Sensor Type):1 (0x00000001)
2、Sensor_ TYPE_STEP_DETECTOR
步行检测传感器,用户每走一步就触发一次事件
传感器类型值(Sensor Type):18 (0x00000012)
3、Sensor_ TYPE_STEP_COUNTER
计步传感器
传感器类型值(Sensor Type):19 (0x00000013)
一般来说,如何判断某款手机是否支持自带计步器,一个方法即可实现:
/** * Returns true if this device is supported. It needs to be running Android KitKat (4.4) or * higher and has a step counter and step detector sensor. * This check is useful when an app provides an alternative implementation or different * functionality if the step sensors are not available or this code runs on a platform version * below Android KitKat. If this functionality is required, then the minSDK parameter should * be specified appropriately in the AndroidManifest. * * @return True iff the device can run this sample */public static boolean isKitkatWithStepSensor(Context cxt) {
// Require at least Android KitKat
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
// Check that the device supports the step counter and detector sensors
PackageManager packageManager = cxt.getPackageManager();
return currentApiVersion >= android.os.Build.VERSION_CODES.KITKAT&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER)
&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_DETECTOR);
}
根据Google官方发布的Androd版本,在Android4.4以后的版本应该要封装StepListener,至于为什么有的国产手机在测试时出现的种种问题,我只在实事求是的这里说明一下,并不针对某个品牌!
测试结果:
华为P9:不带计步器,不能使用Sensor_DETECTOR或者Sensor_COUNTER进行计步,并不知道为什么华为手机里面自带的计步软件为何使用正常,估计是把接口封死了,只能自己的应用使用!
魅族MX4-Pro:虽然自带计步器,但是Sensor_DETECTOR中去取vales[0]时,正常应返回1.0,代表正常走一步,但是测试时一直返回0.0,注意:这不是表情,这是0,一直为0!现象比较奇怪吧,所以我又换成Sensor_COUNTER,返回值有时为:第100步,返回100;第101步,返回90;第102步,返回91,然后又恢复正常累加。
三星S7-Edge:自带计步器,且计步相对准确,两种计步方式都可以使用,一直以它为其他手机的参考。
Google Nexus6:自带计步器,准确度与三星的基本保持一致,未出现特殊错误。
以上为手机的测试结果,因为手里就这几块手机,所以测试的宽容度有点低,也希望大家能够了解计步器这个东东也没有什么特殊的,只是一个传感器而已,里面专门对走路的数据进行封装最后传递出来,不用我们自己通过三轴陀螺仪测波峰波谷来判断是否为一个有效的一步,这就大大简化了我们开发者的工作。
还是希望全部的手机厂商能够按照Google的设计来,如果把某些接口封了,你可以给一个说明什么的吧,什么也不说,什么也不给,这种态度有点问题
再次确认:华为P9只携带StepCounter,没有StepDetector。而且在屏幕关闭后StepCounter不会继续工作,估计是为了省电,现在项目里面华为手机全部为模拟计步了。
应该是手机内置的传感器发出的信号计数的
根据手机晃动情况