demo链接:https://download.csdn.net/download/meixi_android/10690974

工具类:

public class StepDetector implements SensorEventListener {//存放三轴数据float[] oriValues = new float[3];final int ValueNum = 4;//用于存放计算阈值的波峰波谷差值float[] tempValue = new float[ValueNum];int tempCount = 0;//是否上升的标志位boolean isDirectionUp = false;//持续上升次数int continueUpCount = 0;//上一点的持续上升的次数,为了记录波峰的上升次数int continueUpFormerCount = 0;//上一点的状态,上升还是下降boolean lastStatus = false;//波峰值float peakOfWave = 0;//波谷值float valleyOfWave = 0;//此次波峰的时间long timeOfThisPeak = 0;//上次波峰的时间long timeOfLastPeak = 0;//当前的时间long timeOfNow = 0;//当前传感器的值float gravityNew = 0;//上次传感器的值float gravityOld = 0;//动态阈值需要动态的数据,这个值用于这些动态数据的阈值final float InitialValue = (float) 1.3;//初始阈值float ThreadValue = (float) 2.0;//波峰波谷时间差int TimeInterval = 250;private StepCountListener mStepListeners;@Overridepublic void onSensorChanged(SensorEvent event) {for (int i = 0; i < 3; i++) {oriValues[i] = event.values[i];}gravityNew = (float) Math.sqrt(oriValues[0] * oriValues[0]+ oriValues[1] * oriValues[1] + oriValues[2] * oriValues[2]);detectorNewStep(gravityNew);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//}public void initListener(StepCountListener listener) {this.mStepListeners = listener;}/** 检测步子,并开始计步* 1.传入sersor中的数据* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中* */public void detectorNewStep(float values) {if (gravityOld == 0) {gravityOld = values;} else {if (detectorPeak(values, gravityOld)) {timeOfLastPeak = timeOfThisPeak;timeOfNow = System.currentTimeMillis();if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= ThreadValue)) {timeOfThisPeak = timeOfNow;/** 更新界面的处理,不涉及到算法* 一般在通知更新界面之前,增加下面处理,为了处理无效运动:* 1.连续记录10才开始计步* 2.例如记录的9步用户停住超过3秒,则前面的记录失效,下次从头开始* 3.连续记录了9步用户还在运动,之前的数据才有效* */mStepListeners.countStep();}if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= InitialValue)) {timeOfThisPeak = timeOfNow;ThreadValue = peakValleyThread(peakOfWave - valleyOfWave);}}}gravityOld = values;}/** 检测波峰* 以下四个条件判断为波峰:* 1.目前点为下降的趋势:isDirectionUp为false* 2.之前的点为上升的趋势:lastStatus为true* 3.到波峰为止,持续上升大于等于2次* 4.波峰值大于20* 记录波谷值* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值* 2.所以要记录每次的波谷值,为了和下次的波峰做对比* */public boolean detectorPeak(float newValue, float oldValue) {lastStatus = isDirectionUp;if (newValue >= oldValue) {isDirectionUp = true;continueUpCount++;} else {continueUpFormerCount = continueUpCount;continueUpCount = 0;isDirectionUp = false;}if (!isDirectionUp && lastStatus&& (continueUpFormerCount >= 2 || oldValue >= 20)) {peakOfWave = oldValue;return true;} else if (!lastStatus && isDirectionUp) {valleyOfWave = oldValue;return false;} else {return false;}}/** 阈值的计算* 1.通过波峰波谷的差值计算阈值* 2.记录4个值,存入tempValue[]数组中* 3.在将数组传入函数averageValue中计算阈值* */public float peakValleyThread(float value) {float tempThread = ThreadValue;if (tempCount < ValueNum) {tempValue[tempCount] = value;tempCount++;} else {tempThread = averageValue(tempValue, ValueNum);for (int i = 1; i < ValueNum; i++) {tempValue[i - 1] = tempValue[i];}tempValue[ValueNum - 1] = value;}return tempThread;}/** 梯度化阈值* 1.计算数组的均值* 2.通过均值将阈值梯度化在一个范围里* */public float averageValue(float value[], int n) {float ave = 0;for (int i = 0; i < n; i++) {ave += value[i];}ave = ave / ValueNum;if (ave >= 8)ave = (float) 4.3;else if (ave >= 7 && ave < 8)ave = (float) 3.3;else if (ave >= 4 && ave < 7)ave = (float) 2.3;else if (ave >= 3 && ave < 4)ave = (float) 2.0;else {ave = (float) 1.3;}return ave;}}

Android精准计步器相关推荐

  1. android精准计步器,Android 超精准计步器开发 - Dylan 计步

    Android超精准计步器开发 亲测在小米.魅族.华为上可用,该app采用后台service计歩服务,所以只要app不被手机杀死在后台也是可以正常计歩的.上图: 1.需要在AndroidManifes ...

  2. 目前最精准的Android开源计步器

    作者:码农一颗颗 链接:http://www.jianshu.com/p/cfc2a200e46d 昨天逛简书看到的文章,记得很久前也有朋友咨询计步器怎么实现,如何保活之类的,刚好看到了文章,然后下载 ...

  3. android 判断手机计步_超精准的Android手机计步器开发

    亲测在小米.魅族.华为上可用,该app采用后台service计歩服务,所以只要app不被手机杀死在后台也是可以正常计歩的.上图: 1.需要在AndroidManifest.xml中添加权限 andro ...

  4. 基于android端计步器软件的尝试

    这学期选了一门java课,然而课已经上完了还是对java一知半解,只能通过大作业来实践一下了.这次要做的是一个计步器软件,最初的目标是想实现记录步数并且显示走过路程,并能与朋友圈好友比较走过步数的功能 ...

  5. Android中计步器的实现

    计步器的原理是通过手机的前后摆动模拟步伐节奏检测.我们本身在手机的传感器中就有计步器的传感器,所以这里我们直接上代码. activity_main.xml <?xml version=" ...

  6. 基于android的计步器文档,基于Android的计步器(Pedometer)的讲解(六)

    计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296 ...

  7. 基于Android的计步器(Pedometer)的讲解-序

    这两个月学校的课程任务太重,又是考试,又是大作业,实在是没时间写博客,正好元旦放假,有时间就把最近做的计步器项目给大家详细讲解一番.这个讲解估计要分很多篇来讲述. 这个项目(Pedometer)已经上 ...

  8. Android精准人脸特征点提取源码方案(2 眨眼检测)

    专栏是介绍人脸相关的一些源码方案,比如人脸识别,对比,特征点提取(如眼睛嘴巴眼球鼻子的3D位置点),性别年龄,表情识别,活体识别(识别张嘴眨眼转头点头动作活体以及静默活体识别)等, 旨在提供一个可以接 ...

  9. android 健康 计步器,健康运动计步器

    健康运动计步器是一款精准的计步软件,通过清晰的图表数据将你每天的运动情况展示出来,健康运动计步器安卓版(轨迹监测)还有非常具有特色的景点路线规划功能,和别人一起快乐运动,非常实用,感兴趣的小伙伴快来下 ...

最新文章

  1. [javaSE] 网络编程(URLConnection)
  2. Mirantis 收购 Docker EE | 云原生生态周报 Vol. 28
  3. 云主机上mysql密码重置
  4. Javascrip之匿名函数
  5. 列举python中可变数据类型_python 可变数据类型 和 不可变数据类型
  6. 显示多个页面退出登陆_软件测试小白如何第一次登陆时给LINUX的配置网络
  7. 动手学servlet(六) 过滤器和监听器
  8. 【C++入门】C++ List类
  9. oracle SQL查询
  10. c++服务器笔试题编程_C++服务器开发面试题
  11. pytorch DataLoader 自定义 sampler
  12. 计算机数字媒体毕业论文,数字媒体技术毕业设计(关于数字媒体技术的论文)
  13. SSM框架:MyBatis
  14. 还记得2048怎么玩吗?快来玩会儿(摸鱼)吧
  15. 格林尼治时间(GMT)格式化
  16. WPS格式的文件如何转换为word格式
  17. python简单爬取安居客的新房和二手房信息
  18. 中式红木整装塑造出中式家居的浪漫氛围
  19. git commit 命令出现“fatal: unable to auto-detect email address (got '******@.(none)')错误
  20. 【服务器数据恢复】OceanStor存储中NAS卷数据丢失的数据恢复案例

热门文章

  1. [css] 说下你对css样式的这几个属性值initial、inherit、unset、revert的理解
  2. 工作323:uni-获取时间参数
  3. “约见”面试官系列之常见面试题之第九十七篇之怎么定义vue-router的动态路由(建议收藏)
  4. 前端学习(2219):react之jsx小案例
  5. 前端学习(1396):项目包含的知识点cookie和session
  6. 前端学习(1176):set数据结构2
  7. 前端学习(705):do-while
  8. MATLAB K-means聚类代码讲解
  9. Linux sed工具用法
  10. java druid sqlite_springboot整合druid抛出dbType not support : sqlite异常