|
摘要
|
|
目录
软件使用说明:... 2
1. 软件简介... 2
2. 免责声明... 2
3. 使用介绍... 2
4. 注意事项... 5
软件参考文档:... 5
5. 开发者简介... 5
6. 软件功能组成... 6
7. 数据库说明... 6
8. 软件关键代码... 6
9. 可扩展方向... 10
RUNNERTOOL
小型计步工具
软件使用说明:
1. 软件简介
| [基本功能] 本软件计步算法来自于Pedometer,通过移动设备配置的加速度传感器(注:需硬件支持)相关参数变化,来确定设备持有人的运动状态,以达到记录一定时间内人体运动量,适用于日常运动的数据测量和记录。 |
2. 免责声明
| 本软件所有数据及服务提供商皆来自于互联网,且最终产品也免费推送给所有人,用户选择安装本软件即视为同意自行承担后续产生的所有风险。 |
3. 使用介绍
| (界面图片遵循从左到右从上到下原则) 用户界面1:启动界面 用户界面2:选择剧烈运动或平缓运动 用户界面3:平缓运动计步开始 用户界面4:平缓运动计步暂停 用户界面5:上传数据(将当前步数上传至云服务器,以便后期数据整理) 用户界面6:设置界面(设置灵敏度,步长,体重) 用户界面7:剧烈运动计步 用户界面8:剧烈运动上传数据 用户界面9:运动成就显示(每100步加一颗星,1000步为最大值) 用户界面10::最大值上传数据
|
4. 注意事项
| 由于源码来源各处,且只使用硬件传感器测量步数,测量值和真实值会有一定的误差,差值依据手机硬件灵敏度各有不同,用户可通过校准步数设置以得到最为精确的测量值,但只作为参考,不应成为最终凭据。 |
软件参考文档:
5. 开发者简介
| 前端交互界面设计:秦剑 后台代码维护及测试:周恒 开发日志记录及文档编写:王瑾 数据维护及软件演示:胡江峰 |
6. 软件功能组成
| 计步功能:分为两个部分。其一是通过加速度传感器的水平向参数波动来计量运动量,此方法适用于慢节奏的运动方式,例如走路,骑车。此类运动方式的特征为在竖直方向的参数变化不明显;其二是综合加速度传感器的水平方向参数和竖直方向参数来计量运动量,此方法适用于节奏比较快、人体竖直方向有很大的波动的运动方式,例如奔跑、下蹲。此类运动方式的特征为水平竖直或竖直方向参数有可捕获的明显的变化。 运动量保存功能:本软件属于主动式计步器,可在使用者运动的时间段内开启,运动结束后关闭,当前时间段内的运动量可保存在数据库内,便于后续的统计。 个性化设置:根据不同使用者的体格,本软件可设置计步灵敏度和步距,针对大小体格的使用者实现更准确的步数统计。 |
7. 数据库说明
| 基于本软件的数据特征以及数据量级,综合前期开发、后期维护以及使用时的简易性的考量,与常规系统不同的是,本软件并未采用安卓内置的SQLLite、甲骨文的MySQL、微软的SQL Server等常用数据库管理软件中的任何一种,而是直接使用网络数据库BMOB,此数据库具有兼容性强(任何项目都可在编写少量代码及导入少量架包的前提下使用该数据库)、操作简便(代码统一,且无需在PC端配置繁多的环境和安装过多的管理工具)、轻松维护(所有数据皆以预定格式存在BOMB云数据库中,只需通过网页登录即可管理数据)等众多优势,适合初学者和轻量级个人开发者,无需浪费大量时间在数据库相关管理软件的安装及纠错上,从而节约大量精力在安卓实现代码的编写。 |
8. 软件关键代码
| 活动关键代码:publicclass StepDetector implements SensorEventListener {
publicstaticintCURRENT_SETP = 0;
publicstaticfloatSENSITIVITY = 0; //SENSITIVITY灵敏度
privatefloatmLastValues[] = newfloat[3 * 2]; privatefloatmScale[] = newfloat[2]; privatefloatmYOffset; privatestaticlongend = 0; privatestaticlongstart = 0;
/** * 最后加速度方向 */ privatefloatmLastDirections[] = newfloat[3 * 2]; privatefloatmLastExtremes[][] = { newfloat[3 * 2], newfloat[3 * 2] }; privatefloatmLastDiff[] = newfloat[3 * 2]; privateintmLastMatch = -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))); if (SettingsActivity.sharedPreferences == null) { SettingsActivity.sharedPreferences = context.getSharedPreferences( SettingsActivity.SETP_SHARED_PREFERENCES, Context.MODE_PRIVATE); } SENSITIVITY = SettingsActivity.sharedPreferences.getInt( SettingsActivity.SENSITIVITY_VALUE, 3); }
// public void setSensitivity(float sensitivity) { // SENSITIVITY = sensitivity; // 1.97 2.96 4.44 6.66 10.00 15.00 22.50 // // 33.75 // // 50.62 // }
// public void onSensorChanged(int sensor, float[] values) { @Override publicvoid onSensorChanged(SensorEvent event) { // Log.i(Constant.STEP_SERVER, "StepDetector"); Sensor sensor = event.sensor; // Log.i(Constant.STEP_DETECTOR, "onSensorChanged"); synchronized (this) { if (sensor.getType() == Sensor. } else { int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0; if (j == 1) { float vSum = 0; for (int i = 0; i < 3; i++) { finalfloat v = mYOffset + event.values[i] * mScale[j]; 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 publicvoid onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub }
} 数据连接关键代码:publicclass step extends BmobObject { /** *构造表 */ privatestaticfinallongserialVersionUID = 3652947210870933847L; private String name; private String address; privateintnum;
public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getNum() { returnnum; } publicvoid setNum(int num) { this.num = num; } public String getAddress() { returnaddress; } publicvoid setAddress(String address) { this.address = address; } }
将步数、日期、星期等数据存入数据库 final step p2 = new step();
Calendar mCalendar = Calendar.getInstance();// 获取当天Calendar对象 int weekDay = mCalendar.get(Calendar.DAY_OF_WEEK);// 当天的星期 int month = mCalendar.get(Calendar.MONTH) + 1;// 当前月份 int day = mCalendar.get(Calendar.DAY_OF_MONTH);// 当前日期
String week_day_str = new String(); switch (weekDay) { case Calendar.SUNDAY:// 星期天 week_day_str = getString(R.string.sunday); break;
case Calendar.MONDAY:// 星期一 week_day_str = getString(R.string.monday); break;
case Calendar.TUESDAY:// 星期二 week_day_str = getString(R.string.tuesday); break;
case Calendar.WEDNESDAY:// 星期三 week_day_str = getString(R.string.wednesday); break;
case Calendar.THURSDAY:// 星期四 week_day_str = getString(R.string.thursday); break;
case Calendar.FRIDAY:// 星期五 week_day_str = getString(R.string.friday); break;
case Calendar.SATURDAY:// 星期六 week_day_str = getString(R.string.saturday); break; }
p2.setName(month + getString(R.string.month) + day + getString(R.string.day)); p2.setAddress(week_day_str); p2.setNum(total_step); p2.save(this, new SaveListener() { @Override publicvoid onSuccess() { // TODO Auto-generated method stub toast("添加数据成功,返回objectId为:"+p2.getObjectId()); }
privatevoid toast(String string) { Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show();
}
@Override publicvoid onFailure(int code, String msg) { // TODO Auto-generated method stub toast("创建数据失败:" + msg); } }); |
9. 可扩展方向
| 本软件目前的数据库只是提供了保存数据的功能,继续开发的情况下可逐渐增加数据本地管理功能,以期实现不同用户登录管理个人运动信息,统计数据且分析得出用户的运动量及其运动轨迹。 本软件功能较为单一,但稳定性良好且十分小巧,可作为插件工具增加到大型系统中,也能有很好的兼容性。 |