Android设备通常包含一系列的传感器,系统也提供了一系列的对应api来检测这些传感器的数据用来处理逻辑开发,具体按照传感器的大的类型可以分为:运动传感器,位置传感器,环境传感器,下面按照这个类型简单的介绍其对应的具体传感器类型(传感器的类型太多,此处不会详细一一介绍,在后续的开发中会对针对的具体传感器进行解释说明):
- 介绍具体的传感器前需要说明的是系统对应的传感器数据有的是基于硬件,有的是基于软件,在下面介绍中会以软/硬标注。
- 运动传感器:软/硬:重力,线性加速度,旋转矢量,有效运动,计步器,步测器,基于硬件传感器:加速计,陀螺仪
- 位置传感器:地磁场传感器,加速度计传感器,两者都是基于硬件的,除此系统还提供一种近程传感器用来确认设备与某个物体的距离,但是这个传感器多数设备不会支持。还有就是Android2.2(api=8)已放弃方向传感器。
- 环境传感器:周围环境温度传感器,光感传感器,压力传感器,相对湿度传感器,温度传感器
- 传感器的使用方式都一样,唯一不同的是不同的传感器检测到的数据不同,响应的数据个数也不同,后续逻辑也不同,此处重点处理传感器的使用方式并解释当前使用的计步器传感器的数据处理,其他传感器会在后续的使用中逐步更新解释。
- 传感器的使用
-
清单文件注册申请使用对应传感器功能
申请传感器功能 - 校验当前设备是否支持此传感器
/**
* 校验是否支持记步
*
* @return
*/
public boolean isSupportStep() {
if (application == null) {
ToastAlone.showShort("StepSensorManager使用前需要提前初始化");
}
PackageManager packageManager = application.getPackageManager();
return packageManager.hasSystemFeature(PackageManager.
FEATURE_SENSOR_STEP_COUNTER) || packageManager.hasSystemFeature(PackageManager.
FEATURE_SENSOR_STEP_DETECTOR);
}
- 注册对应的传感器
/**
* 注册记步传感器
*/
public void registerStepSensor() {
if (sensorManager == null || stepSensor == null) {
ToastAlone.showShort("注册前需要初始化传感器");
}
sensorManager.registerListener(this,stepSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
- 在传感器监听接口(SensorEventListener)中接受响应的数据
@Override
public void onSensorChanged(SensorEvent event) {
if (event == null || event.values == null || event.values.length <= 0) {
return;
}
int sensorType = event.sensor.getType();
if (sensorType == Sensor.TYPE_STEP_COUNTER) {
float stepNum = event.values[0];
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
- 解除注册传感器
public void unRegisterStepSensor() {
if (sensorManager == null || stepSensor == null) {
return;
}
sensorManager.unregisterListener(this);
}
-
记步传感器的逻辑开发
计步器响应数据规则
- 计步器传感器响应数据的规则:只有一个数据就是自开机起累加的一个步行数,没有时间区分,系统重启后这个数据会重置为0
- 基于上面的规则处理类似微信运动的跨天计步器逻辑单凭系统是不能实现的,需要自己处理逻辑:
* 首先分析需要的逻辑是每天统计用户走的步行数,隔天会清空数据重新计算对应的步数。
* 针对上面分析指定下面逻辑:
* 第一次取得数据不可用(不能确认手机的最近启动时机,可能是n天的步行步数了),不过这个数据可以作为参照步数,对后续取得数据进行校验对比,小于这个步数则说明手机重启过
* 后续取得步数如果大于对照步数则说明手机没有重启过,直接相减则是用户已走的步数,并将这个最新步数设置为新的对照步数,若小于上一次的对照步数说明手机重启过,已经从0统计,则步数直接加上上一次的步数即可,同样这个步数也作为下一次的对照步数
* 理想情况夜里12点的时候取得传感器的步数设置为第二天的对照步数,现实中很少app会活着,即时做保活也有可能有问题的,所以跨天后建议第一次数据还是不用只是作为对照参数。保活和常驻服务都会有耗电量大的问题,偶然发现Android系统也提供了类似于闹钟的定时任务管理器(AlarmManager),使用这个定时任务管理器可以定时重复执行任务(任务可以拉起对应的页面,服务,广播),这个应该是可以实现夜里零点更新步行的步数的。这个比较简单具体可以参考下面的文章。
* 使用系统的计步器原本就存在步数不准确的问题,希望处理精确逻辑的不建议使用这个,即时上面也存在两个漏洞一是每天第一天数据不使用,很明显会漏掉步数,第二是手机重启走的步数大于对照参数步数的时候会漏算掉一些步数
* 针对上面问题可以酌量根据需求添加一些步数,比如说第一次可以根据当天时间给一个默认步数值,后面则是加一些通用值。
- 传感器需要注意的点
- 注册传感器的时候可以指定数据上报频率,即:
* SENSOR_DELAY_NORMAL:竖向屏幕刷新的频率
* SENSOR_DELAY_UI:60000微秒延迟
* SENSOR_DELAY_GAME:20000微秒延迟
* SENSOR_DELAY_FASTEST:无延迟立即上报
* 传感器数据上报在传感器触发的时候会回调监听。
参考文章:
官方文档:传感器
简单计步器的使用
计步器api的使用
超精准计步器的研发
系统21后提供了系统常驻服务job,还没有研究使用
Android闹钟定时任务AlarmManager的使用
网友评论