功能模块
- 悦步主要分为三个模块:用户注册、计步、个人主页。
- 用户注册:用户通过输入手机号码,获取短信发送的验证码,之后录入个人信息,完成个人信息的录入之后就可完成注册进行登录。
- 计步:计步页面有圆形的自定义view显示当日步数统计。并且有导航显示,进入导航功能模块,能够记录运动路程轨迹并且能够查找地图元素。
- 个人主页:该功能能够显示用户个人信息,并且能够更改个人信息。而且可以进入聊天机器人模块。
- 聊天机器人,进入时会推送一条养生小知识。用户可与聊天机器人聊天,也可向聊天机器人查询食物和疾病(食物和疾病信息来自百度)
技术说明
- 注册登录
- 使用安卓自带SQLite数据库储存用户信息,继承自SQLiteOpenHelper
- 登陆注册页面使用Mob平台提供的SMSSDK用来发送短信验证手机号
- 通过判断cursor.getCount()是否为0判断手机号是否已被注册
- 登陆或注册成功后使登录状态为true,通过将用户名加入SharedPreferences
- 通过依次判断两个cursor,一个使用用户名查询,另一个使用手机号查询,实现可以通过用户名或手机号登陆
- 用户界面
- 使用ListView显示用户信息,SimpleAdapter填充
- 使用一般公式计算BMI和标准体重一并显示
- 点击列表项弹出AlertDialog,自定义样式(一个输入框),可修改对应信息
- 计步
- LiteOrm:一个开放轻便高效数据库,用于每日步数的存储和频繁更新,每个记录包含自增主键、当日日期、当日步数
- 定时器: 使用synchronized使一次只能有一个线程进入起始函数start()
- 开机完成自动启动计步服务:使用BroadcastReceiver接收开机完成广播
- 检测步数
- 倒计时3.5秒,3.5秒内不会显示计步,用于屏蔽细微波动,未停止则正常计步,开启定时器每2s检测一次是否停止计步
- 检测波峰的判断条件
- 目前点为下降的趋势:isDirectionUp为false
- 之前的点为上升的趋势:lastStatus为true
- 到波峰为止,持续上升大于等于2次
- 波峰值大于1.2g,小于2g
- 记录波谷值
- 观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值
- 要记录每次的波谷值,为了和下次的波峰做对比
- 阈值的计算
- 通过波峰波谷的差值计算阈值
- 记录4个值,存入tempValue[]数组中
- 将数组进行梯度化阈值计算阈值
- 梯度化阈值
- 计算数组的均值
- 通过均值将阈值梯度化在一个范围里
- 取4组数值,进行梯度化,根据测试数据
- 检测步子
- 传入sersor中的数据
- 如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步
- 符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中
- 计步服务Service
- onBind:返回IBinder
- Handler:与StepCountActivity通信
- Bundle: 封装当前步数
- Messenger: 发送
- Thread、Runnable:开启新线程进行计步
- 开启Google内置计步器和加速度传感器
- Notification:在通知栏显示并更新步数,setOngoing(true)设置不可清除
- IntentFilter,addAction(),BroadCastReceiver: 动态接受系统广播,根据亮屏、关屏等动态修改保存数据的时间间隔
- 保存数据:判断数据库当天记录是否为空,空则insert,非空则update
- Wake Lock: 控制休眠时间
- RoundProgressView:自定义圆形进度条
- Paint、Canvas:画出层次圆,通过角度表示进度
- StepCountActivity:计步页面
- ServiceConnection():连接计步服务
- bindService、startService: 混合绑定开启服务
- Handler:每个0.5s请求一次步数并使用RoundProgressView显示当前步数/目标步数
- 一般公式:通过步数粗略计算路程和消耗卡路里
- 地图与定位跟踪
- 百度地图sdk
- 地磁和加速度传感器:显示朝向
- 百度POISearch:根据关键词匹配,范围定为以用户位置为中心方圆10000米
- 百度Marker: 搜索结果在地图上进行标记A到J
- Class drawable,getField(imageName):通过图片(如在drawable下)的名称取得其id
- 百度InfoWindow:点击marker显示出该地点的简要信息
- 百度BDLocationListener:百度定位监听器,每当位置改变,使用onChange可得到当前位置信息
- 百度地图线段类Overlay:每次位置改变记录该位置点,并用线依次连接,以模拟用户行走轨迹,同时计算每段距离相加即为行走的路程
- Chronometer:计时器,点击开始后记录运动时长
- 聊天机器人
- Spanned:兼容html文本和普通文本
- Textview的autolink:允许文本中的链接
- ListView:实现聊天界面
- ChatMsgEntity:自定义的消息类型,包含昵称、时间、发送还是接收标志
- 自定义ChatMsgViewAdapter: 每一项判断是(我)发送消息还是(他)接受消息,分别对应两个xml文件,一左一右
- api:图灵机器人api(智能对话),健康百科api,百度api(健康食品、疾病查询)
- HTTP连接(Get、Post):四个url分为get和post两种方式获取响应
- Json解析:返回的内容都为json格式,需从中提取有用信息
- Handler、Message:使用message.what区分四个功能,从而在handleMessage中做不同的json解析
- 优化
- 用户操作体验
- 用户注册后无需重新登陆,可直接进入计步界面
- 用户可使用用户名或手机号登陆
- 用户在用户信息界面可直接修改信息,方便易用
- 没有复杂的图表,用户只需查看推荐体重、BMI即可知晓身体健康情况和努力的目标
- 计步无需保持应用开启,只需在后台运行服务即可通过通知栏快速查看当前步数,点击通知栏也可快捷进入应用
- 用户在与智能聊天机器人对话时可以方便、快速地查询食品健康信息和疾病信息(病因、用药)
- 用户在获得查询结果时若有链接可以直接点开进入浏览器查看详情
- 应用的运行速度,稳定性,鲁棒性等
- 对更新频繁的步数,不使用安卓自带SQLite,而是LiteOrm,体积更轻,速度更快
- 根据系统广播,如关屏、亮屏等决定不同的更新、保存步数的速率,以便在满足用户需求的情况下减少资源占用
- 经过调试已经基本避免了因service或百度地图闪退的情况
- 优化了代码结构
- 对四个url的http请求,通过增加传入参数(url、apikey)合并到两种情况get和post,而不是每个url一个函数,具有更好的可扩展性,不会因为新增url使代码需要较大变动
- 通过Message.what区分url,在Handle中分情况处理,使代码更易理解
- SQLite查询中,由于每次需要的参数都不同,但是每次返回该记录所有列又会浪费,故使用String数组存储所有需返回的数据,无需重复定义函数,减少了代码规模而不失易读性
- 按功能将文件分类,如计步相关的文件放入StepCount文件夹,再细分为Constant、UI等
- 用户操作体验