小米运动数据导出并做个性化统计

       小米运动数据是没有对外提供接口的,它本身提供的数据统计有不足之处,比如体重数据,在一天中不同时间体重数据时不一样的,把所有数据混合在一起看,是很难得出体重变化趋势的。所以,最好是能够获取到这些数据,根据时间段来对数据进行统计,能够更加准确地发现体重变化。在网上找了很多相关资料,并没有可以直接使用的,遇到很多坑,这里分享一下。后期可以考虑做一个更加个性化的界面。

一、效果图

二、操作步骤

1.备份小米运动的数据并导出

      找到小米手机的备份功能,只备份小米运动app,将生成备份文件,格式为bak,后面需要转换解压。在手机的文件浏览器中找到对应的备份文件,一般位于 /MIUI/backup/AllBackup 文件夹内,保存到电脑即可。

2.将bak文件转换成压缩文件

      首先下载WinHex,这个工具可以打开bak文件,用于去除文件头。打开之后,删除“41 4E”前面的数据,然后保存。将bak文件转换成压缩文件需要用到abe.jar,这里提供的abe.jar只能解压低版本的,

http://www.feifeiboke.com/down/201610/Unpack_Bak.rar。后面又在网上找到了最新的abe.jar文件,而且还有源码,可以成功转换bak文件,地址:https://github.com/DustinLi/android-backup-extractor。里面有构建好了的jar包,直接下载就可以使用。

3.读取数据

      数据文件位于apps/com.xiaomi.hm.health/db 文件夹下,睡眠和运动信息存储在origin_db_xxxx中,里面会有三个这样的文件,选择最大的哪个就是我们需要的文件。该文件为sqllite3格式的,用sqlite sduio就可以操作里面的数据了,使用类似操作msql数据库。

4.数据分析

      体重数据在WEIGHT_INFOS表里面,用sqlite studio打开“工具”--》“打开sql编辑器”就可以写sql进行数据查询分析了。sqllite的sql查询语法与mysql基本类似,只是一些函数的使用有些差别。下面将用到的sql提供出来:

select datetime(TIMESTAMP/1000,'unixepoch', 'localtime') AS time,WEIGHT*2/563 from weight_infos ORDER BY WEIGHT DESC;

-- 统计早晨的数据
select 
strftime('%Y-%m-%d',datetime(TIMESTAMP/1000,'unixepoch', 'localtime'), 'localtime') as day
,datetime(TIMESTAMP/1000,'unixepoch', 'localtime') as time 
,sum(WEIGHT*2)/count(TIMESTAMP) as data
from weight_infos where time>day||' 07:00:00' and time<day||' 10:00:00' group by strftime('%Y-%m',datetime(TIMESTAMP/1000,'unixepoch', 'localtime'), 'localtime');

-- 统计晚上的数据
select datetime(TIMESTAMP/1000,'unixepoch', 'localtime') AS time,WEIGHT*2 from weight_infos  where time>substr(time,0,11)||" 20:00:00" and time<substr(time,0,11)||" 24:00:00" ORDER BY WEIGHT DESC;

注意:这里字符串拼接用的是“||”而不是“+”,使用+号并不能成功拼接出数据。另外,使用strftime函数之后,时间不是24小时制了,晚上的数据就没有用这个函数。

三、展望

      这里只是简单做了数据的分析,计划做成一个开源项目,方便更多人使用。目前有服务器,但缺少时间来完善项目。周末会抽点时间来完善一下。有感兴趣的朋友可以私聊一起搞,人多力量大。小米运动app提供的数据分析使用起来真的很不方便。对运动、睡眠、健身等数据进行更多的分析,可以更好控制自己的健康状况。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章