了解安卓傳感器主要分為三種
動作傳感器:加速傳感器,重力傳感器,陀螺儀傳感器,旋轉(zhuǎn)向量傳感器
環(huán)境傳感器,光線傳感器,溫度傳感器(據(jù)說還有大氣壓傳感器)
位置傳感器:方向傳感器,磁場傳感器
其中這些傳感器又分為硬件傳感器和軟件傳感器!所謂硬件傳感器就是純粹基于手機(jī)硬件獲取的數(shù)據(jù)
而軟件傳感器并不是真實(shí)存在,而是基于硬件傳感器基于一系列算法產(chǎn)生的偽傳感器,比如方向傳感器就是基于距離傳感器和磁場傳感器經(jīng)過這兩個(gè)傳感器一系列算法得出!
在安卓開發(fā)中,已經(jīng)提供了傳感器的API就是
1 SensorManager類,該類是用來注冊,監(jiān)聽,銷毀監(jiān)聽器的方法,以及獲取傳感器數(shù)量種類精度等方法
2 Sensor類是提供了傳感器的信息比如傳感器的類型,版本,制造商等等比如常見的SensorType類型
序號傳感器Sensor類中定義的TYPE常量
2溫度傳感器TYPE_AMBIENT_TEMPERATURE
3陀螺儀傳感器TYPE_GYROSCOPE
4光線傳感器TYPE_LIGHT
5磁場傳感器TYPE_MAGNETIC_FIELD
6壓力傳感器TYPE_PRESSURE
7臨近傳感器TYPE_PROXIMITY
8濕度傳感器TYPE_RELATIVE_HUMIDITY
9方向傳感器TYPE_ORIENTATION
10重力傳感器TYPE_GRAVITY
11線性加速傳感器TYPE_LINEAR_ACCELERATION
12旋轉(zhuǎn)向量傳感器TYPE_ROTATION_VECTOR
3 SensorEventListener接口,主要就是傳感器開發(fā)的監(jiān)聽回調(diào),傳感器的數(shù)值發(fā)生變化時(shí)就會調(diào)用這個(gè)方法
4 SensorEvent類是回調(diào)監(jiān)聽的參數(shù),主要封裝了傳感器的監(jiān)聽數(shù)值(以數(shù)組形式存在)
這個(gè)就是傳感器開發(fā)會用到的主要API,話說查了不少資料。..
待會后面的一些內(nèi)容是我這次項(xiàng)目開發(fā)用不到的,但是為了考慮以后會遇上,我就一并記錄在這里了,這樣之后在進(jìn)行傳感器開發(fā),我不用再去查資料了,直接看我這篇帖子就囊括了大部分的資料
然后是我們要確定傳感器的開發(fā)流程
1創(chuàng)建傳感器管理類,
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
2選擇項(xiàng)目開發(fā)中會遇到的傳感器(最好打印出列表看手機(jī)支持那些傳感器,主要用來看手機(jī)支持那些傳感器,實(shí)際開發(fā)不需要這行代碼)
List《Sensor》 sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);//主要用來看看手機(jī)支持哪些傳感器,可以不寫
3注冊你要監(jiān)聽的傳感器監(jiān)聽器,實(shí)現(xiàn)監(jiān)聽方法
我的項(xiàng)目經(jīng)過我的測試實(shí)際用到的是方向傳感器
//方向傳感器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_UI);
這里要注意了,要為了用戶負(fù)責(zé),注冊了就要反注冊,否則傳感器可是耗電大戶,我們一般在onResume注冊監(jiān)聽,在onPause進(jìn)行解綁
mSensorManager.unregisterListener(this);
這里介紹下監(jiān)聽器的三個(gè)參數(shù)
registerListener(參數(shù)一,參數(shù)二,參數(shù)三)
參數(shù)一就是監(jiān)聽回調(diào)對象,實(shí)現(xiàn)這個(gè)接口,編譯器會自動復(fù)寫這兩個(gè)方法,我們下面再介紹這兩個(gè)方法
參數(shù)二你需要監(jiān)聽的傳感器類型
參數(shù)三 傳感器獲取數(shù)值的模式,你可以理解成傳感器監(jiān)聽周圍變化塊慢,這個(gè)參數(shù)是一個(gè)常量,一般有四種
SENSOR_DELAY_FASTEST 最快,耗電大戶 ,監(jiān)聽的越快耗電量越大,這種模式一般不建議使用,因?yàn)楸O(jiān)聽周圍大量的數(shù)據(jù),算法如果不好將會影響游戲邏輯以及UI性能
SENSOR_DELAY_GAME 一般用來開發(fā)游戲,用于實(shí)行性較高的游戲比如一些賽車游戲,游戲開發(fā)建議用這個(gè)模式
SENSOR_DELAY_NORMAL 默認(rèn)的平率,對于一般的益智類游戲使用,比如根據(jù)重力來調(diào)整小球進(jìn)洞的小游戲,如果這個(gè)模式應(yīng)用在賽車游戲上,采樣率太低會導(dǎo)致跳幀
SENSOR_DELAY_UI 根據(jù)傳感器更新UI,我們一般根據(jù)傳感器的值變化用來繪制我們相應(yīng)的UI,延遲一點(diǎn)反而好不用平凡的繪制UI造成性能浪費(fèi)
4 開始考慮傳感器采集的數(shù)據(jù)以及算法邏輯了,以上三步全是模板代碼,第四步才是傳感器開發(fā)的核心!
首先要知道不同的傳感器返回的采樣數(shù)據(jù)是不同的,如下
4-1加速度傳感器
加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數(shù)值。
該數(shù)值包含地心引力的影響,單位是m/s^2。
將手機(jī)平放在桌面上,x軸默認(rèn)為0,y軸默認(rèn)0,z軸默認(rèn)9.81。
將手機(jī)朝下放在桌面上,z軸為-9.81。
將手機(jī)向左傾斜,x軸為正值。
將手機(jī)向右傾斜,x軸為負(fù)值。
將手機(jī)向上傾斜,y軸為負(fù)值。
將手機(jī)向下傾斜,y軸為正值。
加速度傳感器可能是最為成熟的一種mems產(chǎn)品,市場上的加速度傳感器種類很多。
手機(jī)中常用的加速度傳感器有BOSCH(博世)的BMA系列,AMK的897X系列,ST的LIS3X系列等。
這些傳感器一般提供±2G至±16G的加速度測量范圍,采用I2C或SPI接口和MCU相連,數(shù)據(jù)精度小于16bit。
4-2 磁力傳感器
磁力傳感器簡稱為M-sensor,返回x、y、z三軸的環(huán)境磁場數(shù)據(jù)。
該數(shù)值的單位是微特斯拉(micro-Tesla),用uT表示。
單位也可以是高斯(Gauss),1Tesla=10000Gauss。
硬件上一般沒有獨(dú)立的磁力傳感器,磁力數(shù)據(jù)由電子羅盤傳感器提供(E-compass)。
電子羅盤傳感器同時(shí)提供下文的方向傳感器數(shù)據(jù)。
4-3 方向傳感器
方向傳感器簡稱為O-sensor,返回三軸的角度數(shù)據(jù),方向數(shù)據(jù)的單位是角度。
為了得到精確的角度數(shù)據(jù),E-compass需要獲取G-sensor的數(shù)據(jù),
經(jīng)過計(jì)算生產(chǎn)O-sensor數(shù)據(jù),否則只能獲取水平方向的角度。
方向傳感器提供三個(gè)數(shù)據(jù),分別為azimuth、pitch和roll。
azimuth:方位,返回水平時(shí)磁北極和Y軸的夾角,范圍為0°至360°。
0°=北,90°=東,180°=南,270°=西。
pitch:x軸和水平面的夾角,范圍為-180°至180°。
當(dāng)z軸向y軸轉(zhuǎn)動時(shí),角度為正值。
roll:y軸和水平面的夾角,由于歷史原因,范圍為-90°至90°。
當(dāng)x軸向z軸移動時(shí),角度為正值。
電子羅盤在獲取正確的數(shù)據(jù)前需要進(jìn)行校準(zhǔn),通常可用8字校準(zhǔn)法。
8字校準(zhǔn)法要求用戶使用需要校準(zhǔn)的設(shè)備在空中做8字晃動,
原則上盡量多的讓設(shè)備法線方向指向空間的所有8個(gè)象限。
手機(jī)中使用的電子羅盤芯片有AKM公司的897X系列,ST公司的LSM系列以及雅馬哈公司等等。
由于需要讀取G-sensor數(shù)據(jù)并計(jì)算出M-sensor和O-sensor數(shù)據(jù),
因此廠商一般會提供一個(gè)后臺daemon來完成工作,電子羅盤算法一般是公司私有產(chǎn)權(quán)。
4-4 陀螺儀傳感器
陀螺儀傳感器叫做Gyro-sensor,返回x、y、z三軸的角加速度數(shù)據(jù)。
角加速度的單位是radians/second。
根據(jù)Nexus S手機(jī)實(shí)測:
水平逆時(shí)針旋轉(zhuǎn),Z軸為正。
水平逆時(shí)針旋轉(zhuǎn),z軸為負(fù)。
向左旋轉(zhuǎn),y軸為負(fù)。
向右旋轉(zhuǎn),y軸為正。
向上旋轉(zhuǎn),x軸為負(fù)。
向下旋轉(zhuǎn),x軸為正。
ST的L3G系列的陀螺儀傳感器比較流行,iphone4和google的nexus s中使用該種傳感器。
4-5 光線感應(yīng)傳感器
光線感應(yīng)傳感器檢測實(shí)時(shí)的光線強(qiáng)度,光強(qiáng)單位是lux,其物理意義是照射到單位面積上的光通量。
光線感應(yīng)傳感器主要用于Android系統(tǒng)的LCD自動亮度功能。
可以根據(jù)采樣到的光強(qiáng)數(shù)值實(shí)時(shí)調(diào)整LCD的亮度。
4-6 壓力傳感器
壓力傳感器返回當(dāng)前的壓強(qiáng),單位是百帕斯卡hectopascal(hPa)。
4-7 溫度傳感器
溫度傳感器返回當(dāng)前的溫度。
4-8 接近傳感器
接近傳感器檢測物體與手機(jī)的距離,單位是厘米。
一些接近傳感器只能返回遠(yuǎn)和近兩個(gè)狀態(tài),
因此,接近傳感器將最大距離返回遠(yuǎn)狀態(tài),小于最大距離返回近狀態(tài)。
接近傳感器可用于接聽電話時(shí)自動關(guān)閉LCD屏幕以節(jié)省電量。
一些芯片集成了接近傳感器和光線傳感器兩者功能。
下面三個(gè)傳感器是Android2新提出的傳感器類型,目前還不太清楚有哪些應(yīng)用程序使用。
4-9 重力傳感器
重力傳感器簡稱GV-sensor,輸出重力數(shù)據(jù)。
在地球上,重力數(shù)值為9.8,單位是m/s^2。
坐標(biāo)系統(tǒng)與加速度傳感器相同。
當(dāng)設(shè)備復(fù)位時(shí),重力傳感器的輸出與加速度傳感器相同。
4-10 線性加速度傳感器
線性加速度傳感器簡稱LA-sensor。
線性加速度傳感器是加速度傳感器減去重力影響獲取的數(shù)據(jù)。
單位是m/s^2,坐標(biāo)系統(tǒng)與加速度傳感器相同。
加速度傳感器、重力傳感器和線性加速度傳感器的計(jì)算公式如下:
加速度 = 重力 + 線性加速度
4-11 旋轉(zhuǎn)矢量傳感器
旋轉(zhuǎn)矢量傳感器簡稱RV-sensor。
旋轉(zhuǎn)矢量代表設(shè)備的方向,是一個(gè)將坐標(biāo)軸和角度混合計(jì)算得到的數(shù)據(jù)。
RV-sensor輸出三個(gè)數(shù)據(jù):
x*sin(theta/2)
y*sin(theta/2)
z*sin(theta/2)
sin(theta/2)是RV的數(shù)量級。
RV的方向與軸旋轉(zhuǎn)的方向相同。
RV的三個(gè)數(shù)值,與cos(theta/2)組成一個(gè)四元組。
RV的數(shù)據(jù)沒有單位,使用的坐標(biāo)系與加速度相同。
舉例:
sensors_event_t.data[0] = x*sin(theta/2)
sensors_event_t.data[1] = y*sin(theta/2)
sensors_event_t.data[2] = z*sin(theta/2)
sensors_event_t.data[3] = cos(theta/2)
GV、LA和RV的數(shù)值沒有物理傳感器可以直接給出,
需要G-sensor、O-sensor和Gyro-sensor經(jīng)過算法計(jì)算后得出。
算法一般是傳感器公司的私有產(chǎn)權(quán)。
看到了吧,不同的傳感器,返回的數(shù)值單位不僅不一樣,就連返回值的數(shù)量也不同,所以業(yè)務(wù)邏輯算法差距都是非常大的,既然說到了X,Y,Z的正負(fù)值,就不得不說手機(jī)的坐標(biāo)系了
X Y Z分別對應(yīng)values[0]到[2](監(jiān)聽回調(diào)返回的數(shù)組)
這里對傳感器舉下例子
加速度感應(yīng)檢測——Accelerometer
Accelerometer Sensor測量的是所有施加在設(shè)備上的力所產(chǎn)生的加速度的負(fù)值(包括重力加速度)。加速度所使用的單位是m/sec^2,數(shù)值是加速度的負(fù)值。
SensorEvent.values[0]:加速度在X軸的負(fù)值
SensorEvent.values[1]:加速度在Y軸的負(fù)值
SensorEvent.values[2]:加速度在Z軸的負(fù)值
例如:
當(dāng)手機(jī)Z軸朝上平放在桌面上,并且從左到右推動手機(jī),此時(shí)X軸上的加速度是正數(shù)。
當(dāng)手機(jī)Z軸朝上靜止放在桌面上,此時(shí)Z軸的加速度是+9.81m/sec^2。
當(dāng)手機(jī)從空中自由落體,此時(shí)加速度是0
當(dāng)手機(jī)向上以Am/sec^2的加速度向空中拋出,此時(shí)加速度是A+9.81m/sec^2
重力加速度感應(yīng)檢測——Gravity
重力加速度,其單位是m/sec^2,其坐標(biāo)系與Accelerometer使用的一致。當(dāng)手機(jī)靜止時(shí),gravity的值和Accelerometer的值是一致的。
線性加速度感應(yīng)檢測——Linear-Acceleration
Accelerometer、Gravity和Linear-Acceleration三者的關(guān)系如下公式:
accelerometer = gravity + linear-acceleration
地磁場感應(yīng)檢測——Magnetic-field
地磁場的單位是micro-Tesla(uT),檢測的是X、Y、Z軸上的絕對地磁場。
陀螺儀感應(yīng)檢測——Gyroscope
陀螺儀的單位是弧度/秒,測量的是物體分別圍繞X,Y,Z軸旋轉(zhuǎn)的角速度。它的坐標(biāo)系與加速度傳感器的坐標(biāo)系相同。逆時(shí)針方向旋轉(zhuǎn)的角度正的。也就是說,如果設(shè)備逆時(shí)針旋轉(zhuǎn),觀察者向X,Y,Z軸的正方向看去,就報(bào)告設(shè)備是正轉(zhuǎn)的。請注意,這是標(biāo)準(zhǔn)的正旋轉(zhuǎn)的數(shù)學(xué)定義。
光線感應(yīng)檢測——Light
values[0]:表示環(huán)境光照的水平,單位是SI lux。
位置逼近感應(yīng)檢測——Proximity
values[0]:逼近的距離,單位是厘米(cm)。有一些傳感器只能支持近和遠(yuǎn)兩種狀態(tài),這種情況下,傳感器必須報(bào)告它在遠(yuǎn)狀態(tài)下的maximum_range值和在近狀態(tài)下的小值。
旋轉(zhuǎn)矢量感應(yīng)檢測——Rotation Vector
旋轉(zhuǎn)向量是用來表示設(shè)備的方向,它是由角度和軸組成,就是設(shè)備圍繞x,y,z軸之一旋轉(zhuǎn)θ角度。旋轉(zhuǎn)向量的三個(gè)要素是,這樣旋轉(zhuǎn)向量的大小等于sin(θ/2),旋轉(zhuǎn)向量的方向等于旋轉(zhuǎn)軸的方向。
values[0]: x*sin(θ/2)
values[1]: y*sin(θ/2)
values[2]: z*sin(θ/2)
values[3]: cos(θ/2) (optional: only if value.length = 4)
方向感應(yīng)檢測——Orientation
其單位是角度
values[0]: Azimuth(方位),地磁北方向與y軸的角度,圍繞z軸旋轉(zhuǎn)(0到359)。0=North, 90=East, 180=South, 270=West
values[1]: Pitch(俯仰),圍繞X軸旋轉(zhuǎn)(-180 to 180), 當(dāng)Z軸向Y軸運(yùn)動時(shí)是正值
values[2]: Roll(滾),圍繞Y軸旋轉(zhuǎn)(-90 to 90),當(dāng)X軸向Z軸運(yùn)動時(shí)是正值