手機(jī)中的計(jì)步器是怎么實(shí)現(xiàn)的,,是怎樣具體收集這些信息的
計(jì)步器讀取手機(jī)傳感器(讀取三軸陀螺儀數(shù)據(jù))收集的數(shù)據(jù),,進(jìn)行二次解讀和算法的過程,。因?yàn)樾凶邥r(shí)人體做垂直運(yùn)動(dòng),,就會(huì)有個(gè)加速度,,檢測加速度峰值從而記步,。至于準(zhǔn)確與否取決于傳感器靈敏度及軟件分析
重力傳感器:
原理:利用壓電效應(yīng)實(shí)現(xiàn),,傳感器內(nèi)部一塊重物和壓電片整合在一起,,通過正交兩個(gè)方向產(chǎn)生的電壓大小,,來計(jì)算出水平方向,。
用途:手機(jī)橫豎屏智能切換、拍照照片朝向,、重力感應(yīng)類游戲(如滾鋼珠),。
加速度傳感器
原理:與重力傳感器相同,也是壓電效應(yīng),,通過三個(gè)維度確定加速度方向,,但功耗更小,但精度低,。
用途:計(jì)步,、手機(jī)擺放位置朝向角度。
個(gè)人使用過魅族MX4,、PRO6,,兩款都支持計(jì)步。華為P7不支持計(jì)步,。從參數(shù)上看,,計(jì)步功能是霍爾傳感器的功勞?
P7:重力感應(yīng)器,,光線傳感器,,距離傳感器,陀螺儀
MX4:重力感應(yīng)器,,光線傳感器,,觸摸感應(yīng)器,,環(huán)境色溫感應(yīng)器,霍爾磁感應(yīng)器,,紅外距離感應(yīng)器,,陀螺儀,電子羅盤
PRO6:霍爾磁感應(yīng),、 重力感應(yīng),、紅外距離感應(yīng)、陀螺儀,、環(huán)境光度感應(yīng),、觸摸感應(yīng)、電子羅盤,、氣壓計(jì)(支持高度)
拿陀螺儀計(jì)步的是比較低級(jí)的計(jì)步功能,,具體表現(xiàn)就是把手機(jī)拿在手里搖一搖也會(huì)計(jì)步。
高級(jí)一些的是拿“加速度計(jì)”來采集數(shù)據(jù),,準(zhǔn)確度會(huì)有所提高,。當(dāng)然最好的還是兩者結(jié)合使用,單獨(dú)使用各有利弊,。
多說一點(diǎn):安卓手機(jī)因?yàn)橄到y(tǒng)原因,,鎖屏的時(shí)候可能將后臺(tái)的進(jìn)程(應(yīng)用)殺死,所以有時(shí)候鎖屏的時(shí)候,,沒有計(jì)上就是這個(gè)原因,。其實(shí)手機(jī)計(jì)步器也沒有什么特殊的,它只是在手機(jī)中作為一類傳感器進(jìn)行使用,,下面給你列出計(jì)步算法相關(guān)的傳感器:
1,、Sensor_ TYPE_ACCELEROMETER
加速度傳感器,單位是m/s2,,測量應(yīng)用于設(shè)備X,、Y、Z軸上的加速度
傳感器類型值(Sensor Type):1 (0x00000001)
2,、Sensor_ TYPE_STEP_DETECTOR
步行檢測傳感器,,用戶每走一步就觸發(fā)一次事件
傳感器類型值(Sensor Type):18 (0x00000012)
3、Sensor_ TYPE_STEP_COUNTER
計(jì)步傳感器
傳感器類型值(Sensor Type):19 (0x00000013)
一般來說,,如何判斷某款手機(jī)是否支持自帶計(jì)步器,,一個(gè)方法即可實(shí)現(xiàn):
/*** Returns true if this device is supported. It needs to be running Android KitKat (4.4) or* higher and has a step counter and step detector sensor.* This check is useful when an app provides an alternative implementation or different* functionality if the step sensors are not available or this code runs on a platform version* below Android KitKat. If this functionality is required, then the minSDK parameter should* be specified appropriately in the AndroidManifest.** @return True iff the device can run this sample*/public static boolean isKitkatWithStepSensor(Context cxt) {// Require at least Android KitKatint currentApiVersion = android.os.Build.VERSION.SDK_INT;// Check that the device supports the step counter and detector sensorsPackageManager packageManager = cxt.getPackageManager();return currentApiVersion >= android.os.Build.VERSION_CODES.KITKAT&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER)&& packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_DETECTOR);}
根據(jù)Google官方發(fā)布的Androd版本,在Android4.4以后的版本應(yīng)該要封裝StepListener,,至于為什么有的國產(chǎn)手機(jī)在測試時(shí)出現(xiàn)的種種問題,,我只在實(shí)事求是的這里說明一下,并不針對(duì)某個(gè)品牌,!
測試結(jié)果:
華為P9:不帶計(jì)步器,,不能使用Sensor_DETECTOR或者Sensor_COUNTER進(jìn)行計(jì)步,,并不知道為什么華為手機(jī)里面自帶的計(jì)步軟件為何使用正常,估計(jì)是把接口封死了,,只能自己的應(yīng)用使用,!
魅族MX4-Pro:雖然自帶計(jì)步器,但是Sensor_DETECTOR中去取vales[0]時(shí),,正常應(yīng)返回1.0,,代表正常走一步,但是測試時(shí)一直返回0.0,,注意:這不是表情,,這是0,一直為0,!現(xiàn)象比較奇怪吧,所以我又換成Sensor_COUNTER,,返回值有時(shí)為:第100步,,返回100;第101步,,返回90,;第102步,返回91,,然后又恢復(fù)正常累加,。
三星S7-Edge:自帶計(jì)步器,且計(jì)步相對(duì)準(zhǔn)確,,兩種計(jì)步方式都可以使用,,一直以它為其他手機(jī)的參考。
Google Nexus6:自帶計(jì)步器,,準(zhǔn)確度與三星的基本保持一致,,未出現(xiàn)特殊錯(cuò)誤。
以上為手機(jī)的測試結(jié)果,,因?yàn)槭掷锞瓦@幾塊手機(jī),,所以測試的寬容度有點(diǎn)低,也希望大家能夠了解計(jì)步器這個(gè)東東也沒有什么特殊的,,只是一個(gè)傳感器而已,,里面專門對(duì)走路的數(shù)據(jù)進(jìn)行封裝最后傳遞出來,不用我們自己通過三軸陀螺儀測波峰波谷來判斷是否為一個(gè)有效的一步,,這就大大簡化了我們開發(fā)者的工作,。
還是希望全部的手機(jī)廠商能夠按照Google的設(shè)計(jì)來,如果把某些接口封了,,你可以給一個(gè)說明什么的吧,,什么也不說,,什么也不給,這種態(tài)度有點(diǎn)問題
再次確認(rèn):華為P9只攜帶StepCounter,沒有StepDetector,。而且在屏幕關(guān)閉后StepCounter不會(huì)繼續(xù)工作,,估計(jì)是為了省電,現(xiàn)在項(xiàng)目里面華為手機(jī)全部為模擬計(jì)步了,。
應(yīng)該是手機(jī)內(nèi)置的傳感器發(fā)出的信號(hào)計(jì)數(shù)的
根據(jù)手機(jī)晃動(dòng)情況
看距離地圖上算的