前言:本來這個(gè)月是想順著上周的地圖SDK接著總結(jié)定位SDK的,但是由于本月事情比較多问潭,而梳理這個(gè)咕咚核心功能用到的定位SDK又比較耗時(shí)眷柔,所以暫放一下翁巍,來總結(jié)梳理一下安卓的傳感器。潑辣的你可能又要開罵了...“明明說好造咕咚慌植!點(diǎn)擊進(jìn)來你扯傳感器甚牲,忽悠大眾?”
其實(shí)蝶柿,用過地圖類的軟件或者咕咚的人都應(yīng)該記得丈钙,當(dāng)你處于室內(nèi),或者深山老林交汤,灌木叢生之地雏赦,地圖上標(biāo)注你當(dāng)前位置的點(diǎn)往往一直閃爍,而且閃爍的范圍還比較大。這種時(shí)候星岗,拿著導(dǎo)航地圖卻搞不清自己到底在哪兒的你會(huì)很自然的喊出一句WTF填大!歸結(jié)其原因,不過就是當(dāng)前地圖的GPS信號(hào)太弱俏橘,或者不穩(wěn)定允华。
正如第一篇中所提到,所有的數(shù)據(jù)幾乎都是通過GPS定位寥掐,轉(zhuǎn)化成坐標(biāo)靴寂,然后通過坐標(biāo)去計(jì)算速度,距離曹仗,配速等等榨汤,那么蠕搜,當(dāng)出現(xiàn)前面說的GPS信號(hào)不穩(wěn)定怎茫,或者壓根就沒信號(hào)的時(shí)候怎么辦呢?用戶辛苦跑半天妓灌,結(jié)果你啥數(shù)據(jù)沒記轨蛤,或者是一堆壓根就不是人類能達(dá)到的數(shù)據(jù)(GPS漂移的速度瞬間能上法拉利哦),這兩種體驗(yàn)想想就會(huì)讓很多有脾氣的人又喊到WTF虫埂,然后早卸
時(shí)間限制祥山,,這里直接給出解決方案
1.對(duì)于GPS弱掉伏,或者不穩(wěn)定缝呕,出現(xiàn)小幅飄逸的情況,咕咚等大多數(shù)app都會(huì)采取算法過略斧散,算法排點(diǎn)等處理方法供常,這種情況等到寫完定位SDK后會(huì)詳細(xì)討論~標(biāo)題都已經(jīng)想好了,嗯鸡捐! “徒手造咕咚之優(yōu)化篇(x):GPS取點(diǎn)過濾栈暇,優(yōu)化”。
2.對(duì)于GPS信號(hào)全無(wú)箍镜,或者進(jìn)出地鐵站等場(chǎng)所導(dǎo)致大幅漂移的情況源祈,咕咚等大多數(shù)app采用的是傳感器計(jì)步:通過傳感器估量用戶的行走步數(shù),然后通過估算算出此段距離~當(dāng)然色迂,這種傳感器記步是木有軌跡的香缺!
廢話了半天,終于洗白了歇僧,為什么要扯安卓傳感器赫悄!目的就是處理上面說的第二種情況,當(dāng)極端環(huán)境出現(xiàn)時(shí),讓用戶盡量不早卸~
一埂淮、安卓4.4+自帶計(jì)步傳感器
在大于4.4的設(shè)備安卓設(shè)備上(大多數(shù))姑隅,一般都自帶有兩種計(jì)步傳感器服務(wù),通過獲取到對(duì)應(yīng)的傳感器倔撞,設(shè)置對(duì)應(yīng)的監(jiān)聽讲仰,可以在步數(shù)改變時(shí)候觸發(fā)回調(diào)。 這兩種計(jì)步傳感器可以很方便的幫我們實(shí)現(xiàn)計(jì)步的功能痪蝇。
引用代碼示例
初始化傳感器:
SensorManager sensorManager=(SensorManager) context.getSystemService(mComtext.SENSOR_SERVICE);//獲取系統(tǒng)傳感器服務(wù)
if (VERSION_CODES >= 19) { //4.4設(shè)備之上
addCountStepListener(); //使用系統(tǒng)的計(jì)步傳感器
} else {
addBasePedoListener(); //使用基礎(chǔ)的傳感器 實(shí)質(zhì)是加速傳感器
}
private void addCountStepListener() {
Sensor detectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);//第一種累加計(jì)步鄙陡,特點(diǎn):每次觸發(fā),count+1
Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);//第二種是持續(xù)計(jì)步躏啰,特點(diǎn):在一段時(shí)間里只觸發(fā)一次趁矾,會(huì)累計(jì)步數(shù),在運(yùn)動(dòng)停止后觸發(fā)给僵,并且返回累計(jì)值毫捣。
if (detectorSensor != null) {
sensorType = "TYPE_STEP_DETECTOR";
sensorManager.registerListener(sensorEventListener, detectorSensor, SensorManager.SENSOR_DELAY_UI);
} else if (countSensor != null) {
sensorType = "TYPE_STEP_COUNTER";
sensorManager.registerListener(sensorEventListener, countSensor, SensorManager.SENSOR_DELAY_UI);
} else {
addBasePedoListener();
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (sensorType.equals("TYPE_STEP_DETECTOR")) {
if (event.values[0] == 1.0f ) {
setpCount++;
}
} else if (sensorType.equals("TYPE_STEP_COUNTER")) {
setpCount= (int) event.values[0];
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
整段代碼邏輯如下:
1.獲取傳感器Manager
2.當(dāng)設(shè)備系統(tǒng)>=4.4 通過傳感器Manager獲取類型為TYPE_STEP_DETECTOR和TYPE_STEP_COUNTER的兩種計(jì)步傳感器,并且優(yōu)先使用TYPE_STEP_DETECTOR帝际,
最后activiy實(shí)現(xiàn)SensorEventListener接口獲取回調(diào)onSensorChanged(主要)和onAccuracyChanged(沒用到)
3.當(dāng)設(shè)備低于4.4或者兩種系統(tǒng)傳感器都獲取失敗時(shí)使用基礎(chǔ)傳感器-加速傳感器
二蔓同、系統(tǒng)加速傳感器
引用代碼示例
加速傳感器,當(dāng)無(wú)法使用系統(tǒng)自帶的計(jì)步傳感器時(shí)使用系統(tǒng)的加速傳感器去實(shí)現(xiàn)模擬計(jì)步
StepDcretor為github上基于加速傳感器模擬計(jì)步的實(shí)現(xiàn)~這里有需要的自己百度蹲诀,代碼太長(zhǎng)這里不貼
private void addBasePedoListener() {
// 獲得傳感器的類型斑粱,這里獲得的類型是加速度傳感器
// 此方法用來注冊(cè),只有注冊(cè)過才會(huì)生效脯爪,參數(shù):SensorEventListener的實(shí)例则北,Sensor的實(shí)例,更新速率
StepDcretor stepDetector = new StepDcretor(mComtext);
sensorType = "TYPE_STEP_COUNTER";
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(stepDetector, sensor, SensorManager.SENSOR_DELAY_UI);
stepDetector.setOnSensorChangeListener(mysensorEventListener);
三痕慢、傳感器知識(shí)補(bǔ)充
其實(shí)傳感器的種類還有很多尚揣,在app中的應(yīng)用也不少,其他傳感器沒用過~也不是這里的重點(diǎn)守屉,所以簡(jiǎn)單梳理一下
define SENSOR_TYPE_ACCELEROMETER 1 //加速度
define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
define SENSOR_TYPE_ORIENTATION 3 //方向
define SENSOR_TYPE_GYROSCOPE 4 //陀螺儀
define SENSOR_TYPE_LIGHT 5 //光線感應(yīng)
define SENSOR_TYPE_PRESSURE 6 //壓力
define SENSOR_TYPE_TEMPERATURE 7 //溫度
define SENSOR_TYPE_PROXIMITY 8 //接近
define SENSOR_TYPE_GRAVITY 9 //重力
define SENSOR_TYPE_LINEAR_ACCELERATION 10//線性加速度
define SENSOR_TYPE_ROTATION_VECTOR 11//旋轉(zhuǎn)矢量
可能涉及到的功能大概有 搖一搖惑艇,指南針,游戲開發(fā)用到的光感拇泛,重力滨巴,溫度等(游戲:是男人就上100層),日后如果有涉及到再補(bǔ)充吧