小米運動數據導出並做個性化統計

       小米運動數據是沒有對外提供接口的,它本身提供的數據統計有不足之處,比如體重數據,在一天中不同時間體重數據時不一樣的,把所有數據混合在一起看,是很難得出體重變化趨勢的。所以,最好是能夠獲取到這些數據,根據時間段來對數據進行統計,能夠更加準確地發現體重變化。在網上找了很多相關資料,並沒有可以直接使用的,遇到很多坑,這裏分享一下。後期可以考慮做一個更加個性化的界面。

一、效果圖

二、操作步驟

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提供的數據分析使用起來真的很不方便。對運動、睡眠、健身等數據進行更多的分析,可以更好控制自己的健康狀況。

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