国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Android傳感器開發(fā)

Android傳感器開發(fā) 時(shí)間:2018-09-28      來源:未知

隨著高科技的發(fā)展,手機(jī)的應(yīng)用已經(jīng)滲透到我們生活中的各個(gè)方面,手機(jī)中的各種應(yīng)用比如:光線感應(yīng),跑步記錄儀,搖一搖,地圖等各種軟件的開發(fā)其實(shí)都少不了一種開發(fā)就是android 傳感器的開發(fā)。這篇文章將帶領(lǐng)大家系統(tǒng)認(rèn)識(shí)傳感器的工作原理及開發(fā)。

一、Android傳感器原理及簡(jiǎn)介

傳感器是一種物理裝置或生物器官,能夠探測(cè)、感受外界的信號(hào)、物理?xiàng)l件(如光、熱、濕度)或化學(xué)組成(如煙霧),并將探知的信息傳遞給其他裝置或器官。標(biāo)準(zhǔn)GB7665-1987對(duì)傳感器的定義是:“能感受規(guī)定的被測(cè)量并按照一定的規(guī)律轉(zhuǎn)換成可用信號(hào)的器件或裝置,通常由敏感元件和轉(zhuǎn)換元件組成。”傳感器是一種檢測(cè)裝置,能感受被測(cè)量的信息,并能將檢測(cè)感受到的信息,按一定規(guī)律轉(zhuǎn)換成為電信號(hào)或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲(chǔ)、顯示、記錄和控制等要求。它是實(shí)現(xiàn)自動(dòng)檢測(cè)和自動(dòng)控制的首要環(huán)節(jié)。

在android系統(tǒng)中,當(dāng)手機(jī)內(nèi)置傳感器檢測(cè)到外界的環(huán)境變化后會(huì)引起相應(yīng)的傳感器模塊電阻發(fā)生變化進(jìn)而影響手機(jī)的部分電流和電量。Google封裝提供了對(duì)這些硬件操作的API,因此,我們熟練的掌握這些類和方法就可以進(jìn)行傳感器的開發(fā)了。

 Android系統(tǒng)所支持的傳感器類型

Android感應(yīng)器Android Sensor是一款能夠展示當(dāng)前手機(jī)狀態(tài)的應(yīng)用,包括硬件信息、當(dāng)前位置、加速計(jì)、陀螺儀、光感、磁場(chǎng)、定向、電池窗臺(tái),聲壓,同時(shí)還可以進(jìn)行多點(diǎn)觸控的測(cè)試。

大多數(shù)Android設(shè)備都會(huì)內(nèi)置傳感器,用來測(cè)量運(yùn)動(dòng),旋轉(zhuǎn)和環(huán)境條件(重力,溫度,濕度等),這些傳感器可以將采集到的高精度的數(shù)據(jù)上報(bào)給應(yīng)用程序。們可以將傳感器想成是應(yīng)用程序的外延,幫助我們?cè)O(shè)計(jì)出更加豐富和多元化的應(yīng)用。Android 系統(tǒng)所支持的傳感器類型:

傳感器類型表

傳感器類型 對(duì)應(yīng)值 傳感器名稱

TYPE_ACCELEROMETER 1 加速度

TYPE_MAGNETIC_FIELD 2 磁力

TYPE_ORIENTATION 3 方向

TYPE_GYROSCOPE 4 陀螺儀

TYPE_LIGHT 5 光線感應(yīng)

TYPE_PRESSURE 6 壓力

TYPE_TEMPERATURE 7 溫度

TYPE_PROXIMITY 8 接近

TYPE_GRAVITY 9 重力

TYPE_GRAVITY 10 線性加速度

 傳感器坐標(biāo)系統(tǒng)

通常情況,傳感器框架使用標(biāo)準(zhǔn)的3軸坐標(biāo)系統(tǒng)來表達(dá)數(shù)據(jù)值。對(duì)于大多數(shù)傳感器,坐標(biāo)系統(tǒng)是相對(duì)與設(shè)備被保持在默認(rèn)方向時(shí)的設(shè)備的屏幕來定義的。當(dāng)設(shè)備被保持在默認(rèn)方向時(shí),X軸是水平向右、Y軸是垂直向上、Z軸是指向屏幕面板的外部。在這個(gè)系統(tǒng)中,背對(duì)著屏幕的Z軸坐標(biāo)是負(fù)值。該坐標(biāo)系統(tǒng)被加速度傳感器、重力傳感器、陀螺儀、線性加速度傳感器、磁力儀傳感器使用

要理解的重要的一點(diǎn)是,在設(shè)備屏幕的方向發(fā)生變化時(shí),坐標(biāo)系統(tǒng)的各坐標(biāo)軸不會(huì)發(fā)生變化,也就是說傳感器的坐標(biāo)系統(tǒng)不會(huì)因設(shè)備的移動(dòng)而改變。這種行為與OpenGL坐標(biāo)系統(tǒng)的行為相同。

另外要理解的一點(diǎn)是,應(yīng)用程序不要假設(shè)設(shè)備的自然(默認(rèn))方向是縱向的。對(duì)于很多平板設(shè)備的自然方向是橫向的。傳感器坐標(biāo)系統(tǒng)總基于設(shè)備的自然方向。

 Android傳感器常用類和接口:

傳感器屬于Android應(yīng)用的外延,Android應(yīng)用不能直接對(duì)傳感器進(jìn)行操作,Android對(duì)硬件的操作進(jìn)行了封裝,提供給我們一些類和接口,我們通過類和接口來調(diào)用方法可以獲取傳感器上報(bào)的數(shù)據(jù)。Android傳感器開發(fā)中常用的類和接口有SensorManager、SensorEventListener、Sensor、SensorEvent。顧名思義,SensorManager就是所有傳感器的一個(gè)綜合管理類,包括了傳感器的種類、采樣率、精準(zhǔn)度等。可以通過getSystemService方法來獲取一個(gè)SensorManager對(duì)象。類和接口的作用如下:

Android傳感器類和接口

類或接口 作用

SensorManager 1. 獲取手機(jī)內(nèi)置傳感器列表

2. 注冊(cè)指定傳感器監(jiān)聽器

3. 注銷監(jiān)聽器

Sensor 1. 用來表示一個(gè)傳感器的類

2. 設(shè)置傳感器的能力

SensorEvent 1. 用來封裝傳感器上報(bào)數(shù)據(jù)的類

SensorEventListener 1. 用來監(jiān)聽傳感器上報(bào)數(shù)據(jù)的監(jiān)聽器接口

 Android傳感器的功能

要在Android中使用傳感器,首先要了解SensorManager和SensorEventListener。顧名思義,SensorManager就是所有傳感器的一個(gè)綜合管理類,包括了傳感器的種類、采樣率、精準(zhǔn)度等。可以通過getSystemService方法來獲取一個(gè)SensorManager對(duì)象。

代碼清單1 獲取SensorManager對(duì)象

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

取得SensorManager對(duì)象之后,可以通過getSensorList方法來獲取我們所需的傳感器類型,保存到一個(gè)傳感器列表中。

代碼清單2 getSensorList

List sensors =

mSensorManager.getSensorList(Sensor.TYPE_ALL);

SensorManager還有很多的常量以及一些常用的方法。

SensorManager常用方法

方法 說明

getDefaultSensor 得到默認(rèn)的傳感器對(duì)象

getInclination 得到地磁傳感器傾斜角的弧度

getOrientation 得到設(shè)備的旋轉(zhuǎn)方向

getSensorList 得到指定傳感器的列表

要與傳感器進(jìn)行交互,應(yīng)用程序必須注冊(cè)以偵聽與一個(gè)或多個(gè)傳感器相關(guān)的活動(dòng)。Android中提供了registerListener來注冊(cè)一個(gè)傳感器,并提供了unregisterListener來卸載一個(gè)傳感器。registerListener方法包括三個(gè)參數(shù):第一個(gè)參數(shù)是接收信號(hào)的Listener實(shí)例;第二個(gè)參數(shù)是想接收的傳感器類型的列表(上一步創(chuàng)建的List對(duì)象);第三個(gè)參數(shù)為接收頻度。調(diào)用后返回一個(gè)boolean型的值,true表示成功,false表示失敗。不再使用以后需進(jìn)行卸載。

代碼清單3 注冊(cè)和卸載傳感器

//注冊(cè)傳感器

Boolean mRegisteredSensor = mSensorManager.registerListener (this, sensor, SensorManager.SENSOR_DELAY_FASTEST);

//卸載傳感器

mSensorManager.unregisterListener(this);

其中,SensorEventListener是使用傳感器的核心部分,包括以下兩個(gè)必須實(shí)現(xiàn)的方法:  onSensorChanged(SensorEvent event)方法在傳感器值更改時(shí)調(diào)用。該方法只有受此應(yīng)用程序監(jiān)視的傳感器調(diào)用。參數(shù)包括一個(gè)SensorEvent對(duì)象。該對(duì)象包括一組浮點(diǎn)數(shù),表示傳感器獲得的方向、加速度等信息。代碼清單4所示的代碼可以取得其值。

代碼清單4 獲取傳感器獲取信息

float x = event.values[SensorManager.DATA_X];

float y = event.values[SensorManager.DATA_Y];

float z = event.values[SensorManager.DATA_Z];

 onAccuracyChanged(Sensor sensor,int accuracy)方法在傳感器的精準(zhǔn)度發(fā)生改變時(shí)調(diào)用。參數(shù)包括兩個(gè)整數(shù):一個(gè)表示傳感器,另一個(gè)表示該傳感器新的準(zhǔn)確值。

二、常用傳感器

1. 方向傳感器

一般情況下,在Android系統(tǒng)中對(duì)應(yīng)的字段常量是TYPE_ORIENTATION,得到方向傳感器在方向傳感器中values變量的3個(gè)值都表示度數(shù),他們的含義如下:

values[0]:該值表示方位,也就是手機(jī)繞著Z軸旋轉(zhuǎn)的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果values[0]的值正好是這4個(gè)值,并且手機(jī)是水平放置,表示手機(jī)的正前方就是這4個(gè)方向。電子羅盤就是利用這個(gè)特性來實(shí)現(xiàn)的。

values[1]:該值表示傾斜度,或手機(jī)翹起的程度。當(dāng)手機(jī)繞著X軸傾斜時(shí)該值發(fā)生變化。values[1]的取值范圍是-180≤values[1]≤180。假設(shè)將手機(jī)屏幕朝上水平放在桌子上,這時(shí)如果桌子是完全水平的,values[1]的值應(yīng)該是0(由于很少有桌子是絕對(duì)水平的,因此,該值很可能不為0,但一般都是-5和5之間的某個(gè)值)。

values[2]:表示手機(jī)沿著Y軸的滾動(dòng)角度。取值范圍是-90≤values[2]≤90。假設(shè)將手機(jī)屏幕朝上水平放在桌面上,這時(shí)如果桌面是平的,values[2]的值應(yīng)為0。將手機(jī)左側(cè)逐漸抬起時(shí),values[2]的值逐漸變小,直到手機(jī)垂直于桌面放置,這時(shí)values[2]的值是-90。將手機(jī)右側(cè)逐漸抬起時(shí),values[2]的值逐漸增大,直到手機(jī)垂直于桌面放置,這時(shí)values[2]的值是90。在垂直位置時(shí)繼續(xù)向右或向左滾動(dòng),values[2]的值會(huì)繼續(xù)在-90至90之間變化。

2. 磁力傳感器

磁力傳感器簡(jiǎn)稱為M-sensor,在Android 中對(duì)應(yīng)的字段常量是TYPE_MAGNETIC_FIELD,該傳感器主要讀取的是磁場(chǎng)的變化,通過該傳感器便可開發(fā)出指南針、羅盤等磁場(chǎng)應(yīng)用。返回x、y、z三軸的環(huán)境磁場(chǎng)數(shù)據(jù)。該數(shù)值的單位是微特斯拉(micro-Tesla),用uT表示,單位也可以是高斯(Gauss)。

values[1]:該值表示x方向的磁場(chǎng)分量

values[2]: 該值表示y方向的磁場(chǎng)分量

values[3]: 該值表示z方向的磁場(chǎng)分量

3. 溫度傳感器

溫度傳感器返回當(dāng)前的溫度,在Android 中對(duì)應(yīng)的字段常量是TYPE_TEMPERATURE。此傳感器返回值只有一個(gè)值表示當(dāng)前溫度,單位是攝氏度。

values[0]:當(dāng)前溫度

4. 加速度傳感器

加速度傳感器用來測(cè)量加速度,在Android 中對(duì)應(yīng)的字段常量是TYPE_ACCELEROMETER,在該傳感器上獲取的values變量的3個(gè)元素值分別表示X、Y、Z軸的加速值。例如,水平放在桌面上的手機(jī)從左側(cè)向右側(cè)移動(dòng),values[0]為負(fù)值;從右向左移動(dòng),values[0]為正值。讀者可以通過本節(jié)的例子來體會(huì)加速傳感器中的值的變化。

values[1]:該值表示x方向的加速度分量

values[2]: 該值表示y方向的加速度分量

values[3]: 該值表示z方向的加速度分量

5. 光傳感器

光線傳感器用來測(cè)量當(dāng)前環(huán)境的光線,在Android 中對(duì)應(yīng)的字段常量是TYPE_LIGHT。values數(shù)組只有第一個(gè)元素(values[0])有意義。表示光線的強(qiáng)度。大的值是120000.0f。Android SDK將光線強(qiáng)度分為不同的等級(jí),每一個(gè)等級(jí)的大值由一個(gè)常量表示,這些常量都定義在SensorManager類中,代碼如代碼清單5所示:

代碼清單5 光線強(qiáng)度等級(jí)

public static final float LIGHT_SUNLIGHT_MAX =120000.0f;

public static final float LIGHT_SUNLIGHT=110000.0f;

public static final float LIGHT_SHADE=20000.0f;

public static final float LIGHT_OVERCAST= 10000.0f;

public static final float LIGHT_SUNRISE= 400.0f;

public static final float LIGHT_CLOUDY= 100.0f;

public static final float LIGHT_FULLMOON= 0.25f;

public static final float LIGHT_NO_MOON= 0.001f;

上面的八個(gè)常量只是臨界值。讀者在實(shí)際使用光線傳感器時(shí)要根據(jù)實(shí)際情況確定一個(gè)范圍。例如,當(dāng)太陽逐漸升起時(shí),values[0]的值很可能會(huì)超過LIGHT_SUNRISE,當(dāng)values[0]的值逐漸增大時(shí),就會(huì)逐漸越過LIGHT_OVERCAST,而達(dá)到LIGHT_SHADE,當(dāng)然,如果天特別好的話,也可能會(huì)達(dá)到LIGHT_SUNLIGHT,甚至更高。

三、傳感器開發(fā)步驟

所有的程序開發(fā)都有一定的邏輯和步驟,傳感器的開發(fā)也不例外,傳感器開發(fā)共有3個(gè)步驟,下面以加速度傳感器為例來演示傳感器開發(fā)的三個(gè)具體步驟:

 1.獲取傳感器管理器對(duì)象、傳感器對(duì)象,具體代碼如代碼清單6

代碼清單6 獲取傳感器管理器和傳感器對(duì)象

//獲取傳感器管理器 SensorManager

SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

//獲取加速度傳感器 Sensor

Sensor accelerometerSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

 2.定義傳感器事件,獲取響應(yīng)數(shù)據(jù),具體代碼如代碼清單7

代碼清單7 定義傳感器事件獲取上報(bào)數(shù)據(jù)

//定義傳感器事件監(jiān)聽器

SensorEventListener accelerometerListener = new SensorEventListener() {

//當(dāng)Sensor上報(bào)的數(shù)據(jù)發(fā)生改變時(shí),onSensorChanged被調(diào)用

public void onSensorChanged(SensorEvent event) {

//上報(bào)的數(shù)據(jù)會(huì)保存在values屬性中

float x = event.values[SennsorManager.DATA_X]

float y = event.values[SennsorManager.DATA_Y]

float z = event.values[SennsorManager.DATA_Z]

//x,y,z變量是從加速度傳感器獲取的數(shù)據(jù)

}

//當(dāng)Sensor精度被改變時(shí),onAccuracyChanged被調(diào)用

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}, mSensor, SensorManager.SENSOR_DELAY_NORMAL, null);

 3.注冊(cè)(應(yīng)用)傳感器事件,具體代碼如代碼清單8

代碼清單8 定義傳感器事件獲取上報(bào)數(shù)據(jù)

//在傳感器管理器中注冊(cè)監(jiān)聽器

mSensorManager.registerListener(accelerometerListener, accelerometerSensor,SensorManager.SENSOR_DELAY_NORMAL);

四、開發(fā)案例

下面我們將通過兩個(gè)開發(fā)案例來練習(xí)傳感器的開發(fā)使用

 案例一、光傳感器的應(yīng)用

需求:在手機(jī)屏幕上實(shí)時(shí)顯示當(dāng)前環(huán)境的光線的強(qiáng)弱值

布局文件里只有一個(gè)TextView,非常簡(jiǎn)單,這里就不再粘貼代碼,java代碼具體實(shí)現(xiàn)代碼

如下代碼清單9所示:

代碼清單9 定義傳感器事件獲取上報(bào)數(shù)據(jù)

public class MainActivity extends Activity {

TextView textview;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textview = (TextView) findViewById(R.id.textview);

/**

* 需求:獲取特定傳感器上的上報(bào)數(shù)據(jù)

* 1.獲取特定的傳感器

* 2.給傳感器設(shè)置監(jiān)聽

* 3.獲取上報(bào)數(shù)據(jù)

* */

//獲取特定的傳感器:通過管理器找到特定的傳感器

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

//獲取光傳感器

Sensor lightSensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT);

//給傳感器注冊(cè)監(jiān)聽器

/**

* 第一個(gè)參數(shù):傳感器的監(jiān)聽器

* 第二個(gè)參數(shù):給哪個(gè)傳感器設(shè)置監(jiān)聽

* 第三個(gè)參數(shù):采樣率,即多久進(jìn)行一次采樣

* */

sm.registerListener(new MyListener(), lightSensor, SensorManager.SENSOR_DELAY_NORMAL);

}

/**

* 傳感器的監(jiān)聽器,可以監(jiān)聽傳感器的數(shù)據(jù)變化,上報(bào)數(shù)據(jù)

* */

class MyListener implements SensorEventListener{

/**

* 傳感器上報(bào)數(shù)據(jù)發(fā)生變化時(shí)調(diào)用的方法

* */

@Override

public void onSensorChanged(SensorEvent event) {

//獲取上報(bào)數(shù)據(jù)的數(shù)組,在光線傳感器中只有一個(gè)values[0],代表了當(dāng)前光線強(qiáng)度

float[] values = event.values;

textview.setText("當(dāng)前光線為:"+values[0]);

}

/**

* 傳感器精度發(fā)生變化時(shí)調(diào)用的方法

* */

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

}

}

這里只是舉例一個(gè)非常簡(jiǎn)單的利用光傳感器的案例,讀者有興趣還可以實(shí)現(xiàn)通過加速度傳感器實(shí)現(xiàn)搖一搖的功能。

上一篇:學(xué)習(xí)Linux一點(diǎn)心得

下一篇:實(shí)現(xiàn)一鍵退出所有的activity

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部