Android——学习计步器心得(一)

Android与iOS传感器数据读取实战:从原理到应用开发指南 传感器是移动设备连接物理世界与数字世界的核心硬件,其通过感知加速度、角速度、光线等物理量,将现实世界的运动和环境状态转化为可处理的数字信号。其工作原理基于微机电系统(MEMS),通过捕捉微小的物理变化并转换为电信号。这项技术的价值在于为移动应用赋予了环境感知与智能交互能力,是实现沉浸式体验和上下文智能的基础。在工程实践中,开发者需要掌握跨平台(Android/iOS)的API调用、数据采样率控制、实时滤波算法以及功耗管理。这些技术广泛应用于健康健身(如计步器)、增强现实(AR)游戏、智能家居控制以及运动姿态 阅读详情

<span style="white-space: pre;">
</span><span style="color:#ff0000;">自己研究加上网上查资料基本上能实现加速器记步功能,下来把代码贴上。
</span>
<span style="color:#ff0000;">第一个包是后台服务Service</span>
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;


 //service负责后台的需要长期运行的任务
 // 计步器服务
 // 运行在后台的服务程序,完成了界面部分的开发后
 // 就可以开发后台的服务类StepService
 // 注册或注销传感器监听器,在手机屏幕状态栏显示通知,与StepActivity进行通信,走过的步数记到哪里了
public class StepService extends Service {

	public static Boolean FLAG = false;// 服务运行标志

	private SensorManager mSensorManager;// 传感器服务
	private StepDetector detector;// 传感器监听对象

	private PowerManager mPowerManager;// 电源管理服务
	private WakeLock mWakeLock;// 屏幕灯

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();

		FLAG = true;// 标记为服务正在运行

		// 创建监听器类,实例化监听对象
		detector = new StepDetector(this);

		// 获取传感器的服务,初始化传感器
		mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);
		// 注册传感器,注册监听器
		mSensorManager.registerListener(detector,
				mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
				SensorManager.SENSOR_DELAY_FASTEST);

		// 电源管理服务
		mPowerManager = (PowerManager) this
				.getSystemService(Context.POWER_SERVICE);
		mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK
				| PowerManager.ACQUIRE_CAUSES_WAKEUP, "Jackie");
		mWakeLock.acquire();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		FLAG = false;// 服务停止
		if (detector != null) {
			mSensorManager.unregisterListener(detector);
		}

		if (mWakeLock != null) {
			mWakeLock.release();
		}
	}

}
<span style="color:#ff0000;">然后是计算步数的算法,这段代码是从github上截取下来的。</span>
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

//走步检测器,用于检测走步并计数
/**
 * 具体算法不太清楚。
 * 
 */
public class StepDetector implements SensorEventListener {

	public static int CURRENT_SETP = 0;

	public static float SENSITIVITY = 0; // 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) {
		// TODO Auto-generated constructor stub
		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)));
	
		SENSITIVITY = 10;
	}


	@Override
	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 changed
						int 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) {// 此时判断为走了一步
									Log.i("StepDetector", "CURRENT_SETP:"
											+ CURRENT_SETP);
									CURRENT_SETP++;
									mLastMatch = extType;
									start = end;
								}
							} else {
								mLastMatch = -1;
							}
						}
						mLastDiff[k] = diff;
					}
					mLastDirections[k] = direction;
					mLastValues[k] = v;
				}
			
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub
	}

}
<span style="color:#ff0000;">最后一个是实现记步和卡路里计算的Activity</span>
import java.text.DecimalFormat;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TextView tv_show_step;// 步数
	private TextView tv_calories;// 卡路里
	private Button btn_start;// 开始按钮
	private Button btn_stop;// 停止按钮
	private Double distance = 0.0;// 路程:米
	private Double calories = 0.0;// 热量:卡路里
	private int step_length = 0; // 步长
	private int weight = 0; // 体重
	private int total_step = 0; // 走的总步数
	private Thread thread; // 定义线程对象

	Handler handler = new Handler() {
		public void handleMessage(Message msg) {

			super.handleMessage(msg); // 此处可以更新UI

			countDistance(); // 调用距离方法,看一下走了多远

			if (distance != 0.0) {

				// 体重、距离
				// 跑步热量(kcal)=体重(kg)×距离(公里)×1.036
				calories = weight * distance * 0.01;
			} else {
				calories = 0.0;
			}

			countStep(); // 调用步数方法

			tv_show_step.setText(total_step + "");// 显示当前步数
			tv_calories.setText(formatDouble(calories));// 显示卡路里
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		if (thread == null) {

			thread = new Thread() {// 子线程用于监听当前步数的变化

				@Override
				public void run() {
					// TODO Auto-generated method stub
					super.run();
					int temp = 0;
					while (true) {
						try {
							Thread.sleep(300);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						if (StepService.flag) {
							Message msg = new Message();
							if (temp != StepDetector.CURRENT_SETP) {
								temp = StepDetector.CURRENT_SETP;
							}
							handler.sendMessage(msg);
						}
					}
				}
			};
			thread.start();
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		tv_calories = (TextView) findViewById(R.id.calories);
		tv_show_step = (TextView) findViewById(R.id.step);
		btn_start = (Button) findViewById(R.id.button1);
		btn_stop = (Button) findViewById(R.id.button2);

		step_length = 50;
		weight = 65;

		countDistance();
		countStep();
		if (distance != 0.0) {
			calories = weight * distance * 0.001;
		} else {
			calories = 0.0;
		}

		tv_calories.setText(formatDouble(calories));

		tv_show_step.setText(total_step + "");

		btn_start.setEnabled(!StepService.flag);
		btn_stop.setEnabled(StepService.flag);

		if (StepService.flag) {
			btn_stop.setText("停止");
		} else if (StepDetector.CURRENT_SETP > 0) {
			btn_stop.setEnabled(true);
			btn_stop.setText("暂停");
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	private CharSequence formatDouble(Double doubles) {
		DecimalFormat format = new DecimalFormat("####.##");
		String distanceStr = format.format(doubles);
		return distanceStr.equals("0") ? "0.0" : distanceStr;

	}

	public void onClick(View view) {
		Intent service = new Intent(this, StepService.class);
		switch (view.getId()) {
		case R.id.button1:
			startService(service);
			btn_start.setEnabled(false);
			btn_stop.setEnabled(true);
			btn_stop.setText("暂停");
			break;

		case R.id.button2:
			stopService(service);
			if (StepService.flag && StepDetector.CURRENT_SETP > 0) {
				btn_stop.setText("清零");
			} else {
				StepDetector.CURRENT_SETP = 0;
				btn_stop.setText("暂停");
				btn_stop.setEnabled(false);
				tv_show_step.setText("0");
				tv_calories.setText(formatDouble(0.0));
				// tv_velocity.setText(formatDouble(0.0));

				handler.removeCallbacks(thread);
			}
			btn_start.setEnabled(true);
			break;

		}
	}

	private void countStep() {
		if (StepDetector.CURRENT_SETP % 2 == 0) {
			total_step = StepDetector.CURRENT_SETP / 2 * 3;
		} else {
			total_step = StepDetector.CURRENT_SETP / 2 * 3 + 1;
		}

	}

	private void countDistance() {
		if (StepDetector.CURRENT_SETP % 2 == 0) {
			distance = (StepDetector.CURRENT_SETP / 2) * 3 * step_length * 0.01;
		} else {
			distance = ((StepDetector.CURRENT_SETP / 2) * 3 + 1) * step_length
					* 0.01;
		}

	}

}

ICM-42670-P超低功耗6轴IMU:从硬件设计到软件驱动的全链路实践 惯性测量单元(IMU)作为感知运动状态的核心传感器,其原理是通过测量加速度和角速度来解算物体的姿态与位移。在物联网和可穿戴设备领域,IMU的技术价值在于实现精准的运动追踪与交互,而功耗则是决定设备续航的关键。为了满足对极致续航的需求,工程师需要深入理解IMU的低功耗工作模式、电源管理策略以及与主控MCU的协同设计。本文聚焦于**ICM-42670-P**这款以超低功耗著称的6轴IMU,详细解析其**唤醒运动**、内置计步器等高级功能如何在实际的智能手环、TWS耳机等应用场景中,构建高效的中断驱动系统架构,从 阅读详情

相关推荐

飞思卡尔Xtrinsic多轴传感器平台:从硬件拆解到融合算法实战

多轴传感器融合是嵌入式感知系统的核心技术,它通过算法将加速度计、陀螺仪和磁力计等不同类型传感器的数据进行协同处理,以克服单一传感器的固有缺陷。其基本原理是利用加速度计和磁力计提供的低频、绝对姿态信息,来校正陀螺仪高频但存在积分漂移的相对姿态信息,从而实现稳定、精确的全姿态测量。这项技术的核心价值在于显著提升了运动感知的可靠性和精度,是机器人姿态控制、无人机导航、可穿戴设备及工业状态监测等应用的关键使能技术。飞思卡尔(现NXP)的Xtrinsic传感器平台,集成了高性能的MEMS传感器和直观的调试工具链,为学

weixin_31902781的博客 349

安卓学习之路---计步器算法

【转载】智能手机计步器算法的实现计步器基于安卓的计步器实现

郭阳的博客 1994

MIT App Inventor 2020黑客松:零代码开发实战与创意实现指南

图形化编程和低代码开发平台正在降低应用开发的门槛,让更多人能够快速构建功能原型。其核心原理是通过可视化拖拽组件和逻辑块,替代传统的手写代码,将复杂的编程语法抽象为直观的积木拼接。这种技术的价值在于极大地提升了开发效率,并使得非专业开发者也能参与到应用创新中,推动了技术的民主化。在实际应用场景中,它特别适合教育、社会公益、快速原型验证等领域。MIT App Inventor正是这一领域的代表性工具,其2020年全球黑客松赛事,围绕健康、教育等主题,汇聚了全球开发者利用图形化编程进行创意实践。参赛者通过组件拖拽

weixin_34259232的博客 386

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

这学期选了一门java课,然而课已经上完了还是对java一知半解,只能通过大作业来实践一下了。这次要做的是一个计步器软件,最初的目标是想实现记录步数并且显示走过路程,并能与朋友圈好友比较走过步数的功能,其实和微信运动的那个东西的目标是一样的。但是在实现过程中确实遇到了许多的问题,导致功能有些缩水。计步功能:这其实是一个数学问题,套用不同的公式计步的准确程度真的查了特别多 计步功能: packa

chi_yuhao的博客 2098

Android运动助手开发全解析:从架构设计到轨迹优化实战

在移动应用开发领域,Android平台凭借其开放性占据了重要地位。其核心原理基于Linux内核,通过应用框架层为开发者提供丰富的API。现代Android开发的技术价值在于能够构建功能强大、体验流畅的原生应用,满足各类垂直场景需求。在健康与运动科技这一热门应用场景中,运动类App需要综合运用多传感器数据融合、后台服务保活、高效数据持久化等关键技术。本文聚焦于开发一个功能完整的Android运动助手,深入探讨了如何利用Kotlin协程进行异步任务管理,并借助Room数据库实现运动数据的本地存储与高效查询,从而

weixin_30983965的博客 335

Android健康管家系统开发:从传感器采集到数据可视化的完整实践

在移动应用开发领域,数据采集与可视化是构建用户友好型产品的核心技术。其原理在于通过设备传感器获取原始数据,并经过算法处理转化为有意义的用户信息。这项技术的价值在于能够将抽象数据转化为直观洞察,从而提升用户体验和产品实用性。在健康管理、运动追踪等应用场景中,数据可视化帮助用户清晰了解自身行为模式,例如通过图表展示步数趋势或饮水进度。本文聚焦于Android平台,详细探讨了如何利用SQLite进行本地数据存储,并集成MPAndroidChart库实现动态图表展示,从而构建一个功能完整的个人健康管理系统。

weixin_31858171的博客 230

ApiDemos学习知识点之Sensors

先看一下运行效果 运行效果如上 本demo是以图形方式显示加速度传感器的值的应用程序 Sensor(传感器): 维基百科告诉我:传感器是接收信号或刺激并反应的器件,能将待测物理量或化学量转换成另一对应输出的装置。 比如:重力传感器,方向传感器 Android对每个设备的传感器都进行了抽象,SensorManger类用来控制传感器,Sensor用来描述具体的

张小贝的博客 446

Android 典型技术模块开发详解 代码

Android典型技术模块开发详解 源代码 适合刚步入Android 开发的工作者,对于Android 各个模块能够很好、很全面的讲解。

霍夫变换检测直线java_图像处理之霍夫变换(直线检测算法)_java

图像处理之霍夫变换(直线检测算法)霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪声干扰。经典的霍夫变换常用来检测直线,圆,椭圆等。霍夫变换算法思想:以直线检测为例,每个像素坐标点经过变换都变成都直线特质有贡献的统一度量,一个简单的例子如下:一条直线在图像中是一系列离散点的集合,通过一个...

weixin_34530164的博客 476

安卓实现计步器,能够计算卡路里的消耗

安卓实现计步器,能够计算卡路里的消耗。另外,可以设置目前是跑步还是走路,进行不同的计算。

android手机计步器

java下开发 课程设计 经多人测试结果准觉实验准确 界面简单 主要注重算法部分

Android-计步器的学习心得

这已经是12天

K-night的专栏 3142

python数据处理(一)——如何用python实现excel功能

python如何实现excel的数据提取、指标构建,进行透视分析。

一名数据分析师 2703

现代计步器系统设计:从传感器数据到健康洞察的工程实践

计步器作为个人健康数据采集的基础设备,其核心原理是通过加速度计等惯性传感器捕捉人体运动产生的时序信号。在技术实现上,关键在于对原始传感器数据进行预处理(如去噪、重力分离)和特征提取,进而通过机器学习算法实现精准的步数检测与活动模式识别。这一技术路径的价值在于,它能将离散的步数数据转化为连续、可分析的行为流,为卡路里估算、久坐提醒等健康量化提供数据基础。在应用场景中,现代计步器已从单一功能演变为个人健康数据中枢,尤其在移动健康与可穿戴设备领域,通过多设备数据同步与融合,构建跨终端的无缝体验。本文聚焦于计步器系

weixin_34199764的博客 301

Windows11+VS2022驱动开发环境搭建实战:从零到编译(避坑指南)

本文详细介绍了在Windows11系统下使用VS2022搭建驱动开发环境的完整流程,包括版本匹配、工具安装、环境配置及常见问题解决。重点强调了WDK与系统版本的严格匹配,以及VS2022中驱动开发组件的正确配置方法,帮助开发者高效避坑并成功编译第一个驱动程序。

weixin_29251337的博客 526

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 834

android计步器!Android面试题集2021版,完整PDF

有人问,为什么想要投递大厂,总结一下大概有这么几个出发点: 1.追求高薪资 相对小厂而言,大厂的薪资水平会更高不少。具体数字区间就不细说了,但是大厂整体会大方很多,只要你能够通过面试,30%甚至更高的涨薪都有机会拿到,更何况,大厂的年终奖也不会被“无良”老板随意克扣。 2.追求稳定 去年整体大环境不行,很多公司裁员,尤其是不太盈利的中小厂,比如某团、某滴。而对于大厂而言,裁员的概率会小很多,毕竟裁员带来的收益远比不上因此带来的负面效应和股价下跌。 3.追求职业发展 近两年很多发展快的企业以 double.

左夜天 154

Verilog-asm小练习—PLL建模

Verilog- ams是Verilog标准的模拟混合信号语言,以下是对PLL建模的一种思路参考

weixin_44700185的博客 1016

Eclipse开发Android应用时遇到的问题以及解决方法

前段时间完成了一个小项目:实现一个带有运动轨迹的计步器,并且在第三方接口百度地图上显示具体的位置和运动信息。 接触一些新的事物,总会遇到各种各样的问题。把之记录下来,希望可以帮助到一些跟我一样遇到同样问题的朋友们。

-绿色小屋 2145

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 402

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4592

我的Android之路(1)--自学

4月份在青岛开始自学Java,当时看的是《

sundxing的专栏 651

YOLOv8首创原创改进:即插即用|创新的轻量化非对称多级压缩LADH检测头

总结而言,本文介绍了一种名为轻量化非对称多级压缩LADH检测头的原创改进,该改进可与YOLOv8无缝适配,并显著提升了检测器的性能。在本文中,我们介绍了一种原创改进的检测头,名为轻量化非对称多级压缩LADH检测头,它可与YOLOv8无缝适配,显著提升了检测器的性能。此外,我们引入了多级压缩的概念,通过在不同的检测层级上应用不同程度的压缩,进一步提升了检测头的轻量化特性。具体而言,我们采用了逐级减少卷积核数量和通道数量的策略,以降低模型的参数量和计算复杂度,同时保持较高的检测精度。

IbcVue的博客 2180

无需代码!MIT App Inventor:可视化编程让每个人都能创建Android和iOS应用

你是否梦想过开发自己的手机应用,却苦于不懂编程语言?是否曾被复杂的开发环境吓退?MIT App Inventor正是为你准备的开源可视化编程平台!这个由麻省理工学院维护的革命性工具,让任何人都能通过简单的拖放操作,快速创建功能完整的Android和iOS应用,真正实现了"零代码"应用开发。🚀 ## 什么是MIT App Inventor?为什么它如此受欢迎? MIT App Inventor

gitblog_00805的博客 317

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

congge 4099

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MIT App Inventor终极指南:不用写代码也能打造专业级手机应用

想象一下,你有一个绝佳的创意——可能是帮助老年人记录用药时间的健康助手,或是让小学生爱上数学的互动游戏,又或者是社区邻里共享资源的互助平台。传统上,要实现这些想法需要学习Java、Swift等编程语言,掌握复杂的开发工具,投入数月时间。但今天,我要告诉你一个秘密:**用MIT App Inventor,你完全可以在一个下午就做出第一个可运行的应用原型**,而且不需要写一行代码! MIT App

gitblog_00118的博客 376

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: Android-计步器的学习心得
下一篇: 基于Android的计步器(Pedometer)的讲解-序
Bobby_lyc
博客等级 码龄16年 1164粉丝 89原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值