湖南生物机电职业技术学院.doc_第1页
湖南生物机电职业技术学院.doc_第2页
湖南生物机电职业技术学院.doc_第3页
湖南生物机电职业技术学院.doc_第4页
湖南生物机电职业技术学院.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖南生物机电职业技术学院毕业设计报告书湖南生物机电职业技术学院毕 业 设 计 报 告 书题目: Andor移动应用计步器 专 业 软件技术 班 级 14326 姓 名 周文 指导教师 何 超 2017年 11 月 18 日目 录第一部分 设计任务与调研第二部分 设计说明第三部分 设计成果第四部分 结束语第五部分 致谢第六部分 参考文献第一部分 设计任务与调研 摘要计步器作为现代锻炼的一种监视器,不但能激发人们挑战自己的潜力,还能锻炼身体增强免疫力。他还可以根据一天的运动量来推算出人的身体健康的信息。 1:设计计步器的主要任务;记录行走的步数,行走的时间;根据录入的体重,每天行走的步长,消耗的热量进行计算,并给出评价和建议。 2:设计的思路,方法,程序运行后进入主界面,用户可以看到行程、消耗热量、速度以及步速。点击开始,进入运行状态,点击清零可以使所有数据回归零初始状态。3:参考的相关书籍和网站:安卓应用开发,陈长顺编著,高等教育出版社 Android任务驱动式教程,李维勇等编著,北京航空航天大学出版社 WWW.(传媒教学网)4:目的和总结:基于安卓平台的手机计步器的设计和研究,目的是为了方便用户绿色生活,保持健康的生活态度,并且为用户节约了不必要的开支同时也避免了资源的浪费。系统的一大亮点之一就是传感器的使用,利用传感器可以开发出很多新奇有趣的应用程序,例如计步器,水平仪,甚至在很多游戏中都可以使用传感器来操作游戏。传感器的种类很多,其中包括加速度传感器、姿态传感器、磁场传感器、温度传感器、光传感器等。 第二部分 设计说明1:理论分析:程序运行后进入主界面,用户可以看到行程、消耗热量、速度以及步速。点击开始,进入运行状态,点击清零可以使所有数据回归零初始状态。点击设置选项可以进入设置界面,调节灵敏度来设置需要的灵敏度(灵敏度越高,对身体的动作的感应越灵敏,调节灵敏度来适应不同的体型了,路面等因素),通过设置步长来设置用户自身实际步长(为了估算行走的距离和速度,输入步长得出粗略的距离和速度,仅供参考),设置体重来调节用户的实际体重(这是为了计算消耗的卡路里)。 2:设计方案1)了解相关资料,了解本软件的研究意义,确定实现技术与方式设计总目标及其整体框架。 2)了解用户的使用习惯和使用心理,进行用户需求分析和规范。3)草拟功能模块,画出模块图。4)搜集软件制作素材。5)编写代码实现各个功能模块。6)根据Android特有的使用风格进行布局与优化。7)完成系统测试并改进。 3:内容软件采用最主流的Android软件应用开发风格,并使用Android的原生组件进行开发,界面友好,简洁易懂,组建布局具有诱导性,用户使用极其方便快捷 4:作品特点在设计一款软件时一般都会把它分成几个模块,在模块的基础上还会再分小模块,这样就达到了软件模块化设计的要求,然后再对各个小模块进行详细设计和编写,采用模块化的管理方式可以使软件结构更清晰,也使得软件的管理更有秩序,使别人容易理解和阅读,但是这些模块也要根据别的模块来设计和约束,不能随便设计脱离框架,设计完成后需要把每个设计完成的模块根据总体框架结合起来。第三部分 设计成果1:设计成果图 开始界面运行界面图2:作品评价:本软件中几个模块的功能经过测试,均测试通过,测试结果和最初的设计基本一致,所有的功能均能正常运行,软件需要比较特殊的运行环境,首先手机的重力感应功能必须有,而且Android系统的版本过低将不能使用。至此基于安卓平台的手机计步器的设计基本完成。作品优点:现在智能终端个人信息的泄露通常不会引起用户的觉察,或者即便觉察也无法判断其带来的损失。与早期的安全问题不同,个人信息泄露所带来的通常不是直接的高额话费,而是潜在的巨大经济损失。如银行账户泄密、绝密商业信息泄露等。如何保护用户个人信息,防止在用户不知情的情况下泄露隐私信息,是当前亟待解决的问题。本软件承诺不会残留用户任何的隐私信息。3:程序代码package .stepcounter;import .stepcounter.R;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.SeekBar;import android.widget.Toast;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.TextView;/* * 应用程序的设置界面 */public class SettingsActivity extends Activity public static final String WEIGHT_VALUE = weight_value;public static final String STEP_LENGTH_VALUE = step_length_value;/ 步长public static final String SENSITIVITY_VALUE = sensitivity_value;/ 灵敏值public static final String SETP_SHARED_PREFERENCES = setp_shared_preferences;/ 设置public static SharedPreferences sharedPreferences;private Editor editor;private TextView tv_sensitivity_vlaue;private TextView tv_step_length_vlaue;private TextView tv_weight_value;private SeekBar sb_sensitivity;private SeekBar sb_step_length;private SeekBar sb_weight;private int sensitivity = 0;private int step_length = 0;private int weight = 0;Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.settings);addView();init();listener();/* * SeekBar的拖动监听 */private void listener() sb_sensitivity.setOnSeekBarChangeListener(new OnSeekBarChangeListener() / 灵敏值动作的监听Overridepublic void onStopTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onStartTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onProgressChanged(SeekBar seekBar,int progress, boolean fromUser) / TODO Auto-generated method stubsensitivity = progress;tv_sensitivity_vlaue.setText(sensitivity + ););sb_step_length.setOnSeekBarChangeListener(new OnSeekBarChangeListener() Overridepublic void onStopTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onStartTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onProgressChanged(SeekBar seekBar,int progress, boolean fromUser) / TODO Auto-generated method stubstep_length = progress * 5 + 40;tv_step_length_vlaue.setText(step_length+ getString(R.string.cm););sb_weight.setOnSeekBarChangeListener(new OnSeekBarChangeListener() Overridepublic void onStopTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onStartTrackingTouch(SeekBar seekBar) / TODO Auto-generated method stubOverridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) / TODO Auto-generated method stubweight = progress * 2 + 30;tv_weight_value.setText(weight + getString(R.string.kg););private void init() / TODO Auto-generated method stubif (sharedPreferences = null) /SharedPreferences是Android平台上一个轻量级的存储类,/主要是保存一些常用的配置比如窗口状态sharedPreferences = getSharedPreferences(SETP_SHARED_PREFERENCES,MODE_PRIVATE);editor = sharedPreferences.edit();sensitivity = 10 - sharedPreferences.getInt(SENSITIVITY_VALUE, 7);step_length = sharedPreferences.getInt(STEP_LENGTH_VALUE, 70);weight = sharedPreferences.getInt(WEIGHT_VALUE, 50);sb_sensitivity.setProgress(sensitivity);sb_step_length.setProgress(step_length - 40) / 5); /步长按钮在进度条上占得比例sb_weight.setProgress(weight - 30) / 2);tv_sensitivity_vlaue.setText(sensitivity + );tv_step_length_vlaue.setText(step_length + getString(R.string.cm);tv_weight_value.setText(weight + getString(R.string.kg);private void addView() tv_sensitivity_vlaue = (TextView) this.findViewById(R.id.sensitivity_value);tv_step_length_vlaue = (TextView) this.findViewById(R.id.step_lenth_value);tv_weight_value = (TextView) this.findViewById(R.id.weight_value);sb_sensitivity = (SeekBar) this.findViewById(R.id.sensitivity);sb_step_length = (SeekBar) this.findViewById(R.id.step_lenth);sb_weight = (SeekBar) this.findViewById(R.id.weight);public void onClick(View view) switch (view.getId() case R.id.save:editor.putInt(SENSITIVITY_VALUE, 10 - sensitivity);editor.putInt(STEP_LENGTH_VALUE, step_length);editor.putInt(WEIGHT_VALUE, weight);mit();Toast.makeText(SettingsActivity.this, 保存成功!, Toast.LENGTH_SHORT).show();this.finish();StepDetector.SENSITIVITY = 10 - sensitivity;break;case R.id.cancle:this.finish();break;default:break;Overrideprotected void onRestart() / TODO Auto-generated method stubsuper.onRestart();init();Overrideprotected void onResume() / TODO Auto-generated method stubsuper.onResume();init();package .stepcounter;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.CountDownTimer;import android.view.Window;/* * 程序启动界面 完成开机动画 并跳转到主程序运行界面StepActivity */public class SplashActivity extends Activity Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);/ 去掉标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.splash);if (StepCounterService.FLAG | StepDetector.CURRENT_SETP 0) / 程序已经启动,直接跳转到运行界面Intent intent = new Intent(SplashActivity.this,StepCounterActivity.class); / 创建一个新的Intent,指定当前应用程序上下文/ 和要启动的StepActivity类startActivity(intent); / 传递这个intent给startActivitythis.finish(); else /* * 倒计时功能 构造函数: public CountDownTimer (long millisInFuture, * longcountDownInterval) 参数 : millisInFuture * 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。 countDownInterval * 接收onTick(long)回调的间隔时间。 */new CountDownTimer(2000L, 1000L) / 倒计时完成后被调用public void onFinish() Intent intent = new Intent(SplashActivity.this,StartActivity.class);/ intent.setClass(, );startActivity(intent);/* * overridePendingTransition: 启动界面淡入淡出效果 * Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。 * 它包括两个部分: * 一部分是第一个activity退出时的动画; * 外一部分时第二个activity进入时的动画; * 它必需紧挨着startActivity()或者finish()函数之后调用 */overridePendingTransition(R.anim.fade_in, R.anim.fade_out);finish();/ 固定间隔被调用/ 参数:millisUntilFinished 倒计时剩余时间。public void onTick(long paramLong) .start();package .stepcounter;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.util.Log;/走步检测器,用于检测走步并计数/* * 具体算法不太清楚,本算法是从谷歌计步器:Pedometer上截取的部分计步算法 * * 因为这个是根据感应加速度来计算是否走一步,所以你在原地晃手机,也会记步,不过正常的走路还是挺准确的。 * */public class StepDetector implements SensorEventListener public static int CURRENT_SETP = 0;public static float SENSITIVITY = 0; / SENSITIVITY灵敏度private float mLastValues = new float3 * 2;private float mScale = new float2;private float mYOffset;private static long end = 0;private static long start = 0;/* * 最后加速度方向 */private float mLastDirections = new float3 * 2;private float mLastExtremes = new float3 * 2, new float3 * 2 ;private float mLastDiff = new float3 * 2;private int mLastMatch = -1;/* * 传入上下文的构造函数 * * param context */public StepDetector(Context context) / TODO Auto-generated constructor stubsuper();int h = 480;mYOffset = h * 0.5f;mScale0 = -(h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2);mScale1 = -(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) / 当传感器检测到的数值发生变化时就会调用这个方法Overridepublic void 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.TYPE_ORIENTATION) else int j = (sensor.getType() = Sensor.TYPE_ACCELEROMETER) ? 1 : 0;if (j = 1) float vSum = 0;for (int i = 0; i mLastValuesk ? 1: (v 0 ? 0 : 1); / minumum or/ maximum?mLastExtremesextTypek = mLastValuesk;float diff = Math.abs(mLastExtremesextTypek- mLastExtremes1 - extTypek);if (diff SENSITIVITY) boolean isAlmostAsLargeAsPrevious = diff (mLastDiffk * 2 / 3);boolean isPreviousLargeEnough = mLastDiffk (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;mLastDiffk = diff;mLastDirectionsk = direction;mLastValuesk = v;/ 当传感器的经度发生变化时就会调用这个方法,在这里没有用Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) / TODO Auto-generated method stubpackage .stepcounter;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 StepCounterService extends Service public static Boolean FLAG = false;/ 服务运行标志private SensorManager mSensorManager;/ 传感器管理服务/* * Step Detector是4.4新增的硬件传感器, 用于识别脚步移动和对移动计数(从重启系统开始计数)的功能, * 使用它们可以让你的APP记录用户的行走,跑步,或者上楼梯等运动。 */private StepDetector detector;/ 传感器监听对象private PowerManager mPowerManager;/ 电源管理服务private WakeLock mWakeLock;/ 屏幕灯Overridepublic IBinder onBind(Intent intent) / TODO Auto-generated method stubreturn null;Overridepublic void onCreate() / TODO Auto-generated method stubsuper.onCreate();FLAG = true;/ 标记为服务正在运行/ 创建监听器类,实例化监听对象detector = new StepDetector(this);/ 获取传感器的服务,初始化传感器mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);/* * 注册传感器,注册监听器: mSensorManager.regesterListener(SensorEventListener * listener, Sensor sensor, int rate); 参数1:传感器监听对象 * 参数2:获取某种类型的感应器:这里我们用到的是重力传感器 参数3:延迟时间的精密度,采样率 * SensorManager.SENSOR_DELAY_FASTEST */mSensorManager.registerListener(detector,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST);/* * 电源管理服务: PowerManager这个类主要是用来控制电源状态的. * 通过使用该类提供的api可以控制电池的待机时间,一般情况下不要使用。 * 如果确实需要使用,那么尽可能的使用最低级别的WakeLocks锁。并且确保使用完后释放它。 * 你可以通过context.getSystemService * (Context.POWER_SERVICE)的方式获得PowerManager的实例。 * * *要进行电源的操作我们需要在清单文件中添加电源管理的权限 */mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);/* * 创建WakeLock对象,通过调用此对象的方法你就可以方便的去控制电源的状态; * Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现; */ PowerManager.SCREEN_DIM_WAK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论