今天先不说Pedometer(计步器)项目UI方面的了,今天讲一个基于重力加速度的记步功能传感器(Sensor),然后

在后台开启记步。

计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~)

github下载

CSDN下载

先上几张效果图:(效果和上一篇讲到的CircleBar非常的相似,因为记步功能在后台)

如图所示,能根据你的一些基本参数,来记步。有一个缺点,因为这个是根据感应加速度来计算是否走一步,所以你在原地晃手机,也会记步,不过正常的走路还是挺准确的。

首先给出StepDetector类的代码:

package com.example.histogram.widet;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;/*** 这是一个实现了信号监听的记步的类* 这是从谷歌找来的一个记步的算法,看不太懂* @author Liyachao Date:2015-1-6**/
public class StepDetector implements SensorEventListener {public static int CURRENT_SETP = 0;public static float SENSITIVITY = 10; // SENSITIVITY灵敏度private float mLastValues[] = new float[3 * 2];private float mScale[] = new float[2];private float mYOffset;private static long end = 0;private static long start = 0;/*** 最后加速度方向*/private float mLastDirections[] = new float[3 * 2];private float mLastExtremes[][] = { new float[3 * 2], new float[3 * 2] };private float mLastDiff[] = new float[3 * 2];private int mLastMatch = -1;/*** 传入上下文的构造函数* * @param context*/public StepDetector(Context context) {super();int h = 480;mYOffset = h * 0.5f;mScale[0] = -(h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2)));mScale[1] = -(h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX)));}//当传感器检测到的数值发生变化时就会调用这个方法public void onSensorChanged(SensorEvent event) {Sensor sensor = event.sensor;synchronized (this) {if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {float vSum = 0;for (int i = 0; i < 3; i++) {final float v = mYOffset + event.values[i] * mScale[1];vSum += v;}int k = 0;float v = vSum / 3;float direction = (v > mLastValues[k] ? 1: (v < mLastValues[k] ? -1 : 0));if (direction == -mLastDirections[k]) {// Direction changedint extType = (direction > 0 ? 0 : 1); // minumum or// maximum?mLastExtremes[extType][k] = mLastValues[k];float diff = Math.abs(mLastExtremes[extType][k]- mLastExtremes[1 - extType][k]);if (diff > SENSITIVITY) {boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k] * 2 / 3);boolean isPreviousLargeEnough = mLastDiff[k] > (diff / 3);boolean isNotContra = (mLastMatch != 1 - extType);if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough&& isNotContra) {end = System.currentTimeMillis();if (end - start > 500) {// 此时判断为走了一步CURRENT_SETP++;mLastMatch = extType;start = end;}} else {mLastMatch = -1;}}mLastDiff[k] = diff;}mLastDirections[k] = direction;mLastValues[k] = v;}}}//当传感器的经度发生变化时就会调用这个方法,在这里没有用public void onAccuracyChanged(Sensor arg0, int arg1) {}}

下来是后台服务StepService的代码:

package com.example.histogram.widet;import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.IBinder;public class StepService extends Service {public static Boolean flag = false;private SensorManager sensorManager;private StepDetector stepDetector;@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {super.onCreate();//这里开启了一个线程,因为后台服务也是在主线程中进行,这样可以安全点,防止主线程阻塞new Thread(new Runnable() {public void run() {startStepDetector();}}).start();}private void startStepDetector() {flag = true;stepDetector = new StepDetector(this);sensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);//获取传感器管理器的实例Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//获得传感器的类型,这里获得的类型是加速度传感器//此方法用来注册,只有注册过才会生效,参数:SensorEventListener的实例,Sensor的实例,更新速率sensorManager.registerListener(stepDetector, sensor,SensorManager.SENSOR_DELAY_FASTEST);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();flag = false;if (stepDetector != null) {sensorManager.unregisterListener(stepDetector);}}
}

最后把FragmentPedometer测试页面的代码也给大家,如果大家看过之前的博客,应该知道这是一个碎片。如果没看过,看兴趣的朋友可以看看之前的博文:

package com.example.histogram;import java.text.SimpleDateFormat;
import java.util.Date;import com.example.changepage1.R;
import com.example.histogram.widet.CircleBar;
import com.example.histogram.widet.StepDetector;
import com.example.histogram.widet.StepService;
import com.example.histogram.widet.Weather;import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;/*** 这是记步的碎片* Author: 李垭超   email:296777513@qq.com* Date: 2015-1-6* Time: 下午8:39*/
public class FragmentPedometer extends Fragment implements OnClickListener{private View view;private CircleBar circleBar;private int total_step = 0;private Thread thread;private int Type = 1;private int calories = 0;private int step_length = 50;private int weight = 70;private Weather weather;private String test;private boolean flag = true;// 来判断第三个页面是否开启动画@SuppressLint("HandlerLeak")Handler handler = new Handler() {public void handleMessage(Message msg) {super.handleMessage(msg);total_step = StepDetector.CURRENT_SETP;if (Type == 1) {circleBar.setProgress(total_step, Type);} else if (Type == 2) {calories = (int) (weight * total_step * step_length * 0.01 * 0.01);circleBar.setProgress(calories, Type);} else if (Type == 3) {if (flag) {circleBar.startCustomAnimation();flag = false;}if (test != null || weather.getWeather() == null) {weather.setWeather("正在更新中...");weather.setPtime("");weather.setTemp1("");weather.setTemp2("");circleBar.startCustomAnimation();circleBar.setWeather(weather);} else {circleBar.setWeather(weather);}}}};@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {view = inflater.inflate(R.layout.pedometer, container, false);init();mThread();return view;}private void init() {     Intent intent = new Intent(getActivity(), StepService.class);getActivity().startService(intent);weather = new Weather();circleBar = (CircleBar) view.findViewById(R.id.progress_pedometer);circleBar.setMax(10000);circleBar.setProgress(StepDetector.CURRENT_SETP, 1);circleBar.startCustomAnimation();circleBar.setOnClickListener(this);}private void mThread() {if (thread == null) {thread = new Thread(new Runnable() {public void run() {while (true) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if (StepService.flag) {Message msg = new Message();handler.sendMessage(msg);}}}});thread.start();}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.progress_pedometer:if (Type == 1) {Type = 2;} else if (Type == 2) {flag = true;Type = 3;} else if (Type == 3) {Type = 1;}Message msg = new Message();handler.sendMessage(msg);break;default:break;}}}

这些是主要的代码,其他次要的我就不贴出来了,如果想要demo的朋友可以在下面留言,我给你们。

如果大家有什么建议,可以提出来哦。

基于Android的计步器(Pedometer)的讲解(四)——后台记步相关推荐

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

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

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

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

  3. 基于Android的计步器(Pedometer)的讲解(二)——柱状图分析2

    早上第二大节有课,所以没有来得及仔细看这个例子,中午回来将这个例子写完了,现在柱状图有两个实现的方式了,一个是之前博客提到的,一个就是现在这个. 这个柱状图也实现了动态的增长,和点击显示相应柱状图的数 ...

  4. 基于Android的计步器(Pedometer)的讲解(六)——ListView下拉刷新页面

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

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

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

  6. 基于Android的校园图书共享app

    需求信息: 设计实现基于Android的高校图书共享App以及后台系统,该App能帮助高校学生共享图书,可以分享自己平时不用的图书和租借自己想看的图书,节省购买图书的金钱和图书过多寝室不好安放的问题. ...

  7. 【毕业设计】基于Android系统的校园图书共享APP的设计实现

    设计实现基于Android的高校图书共享App以及后台系统,该App能帮助高校学生共享图书,可以分享自己平时不用的图书和租借自己想看的图书,节省购买图书的金钱和图书过多寝室不好安放的问题. App具有 ...

  8. Android记步(运动)应用

    Android记步(运动)应用 现如今随着人们对身体健康的追求,人们开始争先恐后的运动,而本文就是利用Android技术,编写一个运动记步数的应用(如有转载,请表明作者). 一.使用Android内置 ...

  9. java实训简单计步器实训报告_基于android的手机计步器设计与实现毕业论文

    基于android的手机计步器设计与实现毕业 论文 目录 1 绪论 (1) 1.1 研究背景 (1) 1.2 Android平台的发展状况 (1) 1.3 研究的目的和意义 (1) 2 相关技术简介 ...

最新文章

  1. html js什么作用,html錨點的作用和js選項卡錨點跳轉的使用
  2. 类从未使用_如果您从未依赖在线销售,如何优化您的网站
  3. python中变量类型在程序中可以改变_详细解析Python当中的数据类型和变量
  4. python创建数据库计算机积极拒绝、无法连接_Python3 请求网页源码 目标计算机积极拒绝,无法连接...
  5. 帆软报表插件开发之fine-decision中的EmbedRequestFilterProvider扩展
  6. DeFi 中的 De 是什么意思?这对区块链行业意味着什么?
  7. 大漠综合工具取点阵显示不全_利用pyfolio工具评价回测资金曲线
  8. 识别视频文件夹,listview
  9. Swagger注解使用示例
  10. 计算机进行运算时为什么采用二进制数,计算机中为什么采用二进制
  11. linux下dd工具,dd 工具使用
  12. halcon机器视觉之玩转车牌识别-超人视觉罗超
  13. Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)
  14. 金庸感人的经典爱情对白
  15. 华硕 内存条 不同步_不想要传统PC的你或者需要看看华硕PN61
  16. 思维改变生活:亲身经历了就一定能明白吗?
  17. 从零点一开始机器学习之GPU运算性能和CPU性能对比(GPU算力表)
  18. 飞思卡尔16位单片机(五)——ADC模数转换模块测试
  19. 时间序列早期分类问题定义和基本思想以及具体方法简述
  20. 基于员工日常行为的异常员工可视化分析

热门文章

  1. vue开发微信公众号之文件下载
  2. 酒店客房管家系统—贴牌oem定制开发商业模式详解
  3. 计算机科学两大难题,缓存失效和命名是计算机科学两大难题,命名也是一种艺术...
  4. 工作心得:mysql之手写sql
  5. 清理系统垃圾(超强版).bat
  6. Java入门第39课——猜字母游戏之实现字母生成方法
  7. 利用Github page快速搭建个人Blog
  8. win7 win8下 dvorak 的安装和练习
  9. 元宇宙:技术演进、产业生态与大国博弈
  10. 现代软件工程_团队项目_阿尔法阶段_需求分析文档_2017.11.13