mooc课程精选,成品人片观看入口众乐乐,久久久久人妻一区精品性色av,苍兰诀大结局是什么,白丝美女被狂躁免费视频网站

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

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

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

一、Android傳感器原理及簡介

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

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

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

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

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

傳感器類型表

傳感器類型 對應(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ù)值。對于大多數(shù)傳感器,坐標(biāo)系統(tǒng)是相對與設(shè)備被保持在默認(rèn)方向時的設(shè)備的屏幕來定義的。當(dāng)設(shè)備被保持在默認(rèn)方向時,X軸是水平向右、Y軸是垂直向上、Z軸是指向屏幕面板的外部。在這個系統(tǒng)中,背對著屏幕的Z軸坐標(biāo)是負(fù)值。該坐標(biāo)系統(tǒng)被加速度傳感器、重力傳感器、陀螺儀、線性加速度傳感器、磁力儀傳感器使用

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

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

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

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

Android傳感器類和接口

類或接口 作用

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

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

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

Sensor 1. 用來表示一個傳感器的類

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

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

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

 Android傳感器的功能

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

代碼清單1 獲取SensorManager對象

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

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

代碼清單2 getSensorList

List sensors =

mSensorManager.getSensorList(Sensor.TYPE_ALL);

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

SensorManager常用方法

方法 說明

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

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

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

getSensorList 得到指定傳感器的列表

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

代碼清單3 注冊和卸載傳感器

//注冊傳感器

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

//卸載傳感器

mSensorManager.unregisterListener(this);

其中,SensorEventListener是使用傳感器的核心部分,包括以下兩個必須實現(xiàn)的方法:  onSensorChanged(SensorEvent event)方法在傳感器值更改時調(diào)用。該方法只有受此應(yīng)用程序監(jiān)視的傳感器調(diào)用。參數(shù)包括一個SensorEvent對象。該對象包括一組浮點數(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ā)生改變時調(diào)用。參數(shù)包括兩個整數(shù):一個表示傳感器,另一個表示該傳感器新的準(zhǔn)確值。

二、常用傳感器

1. 方向傳感器

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

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

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

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

2. 磁力傳感器

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

values[1]:該值表示x方向的磁場分量

values[2]: 該值表示y方向的磁場分量

values[3]: 該值表示z方向的磁場分量

3. 溫度傳感器

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

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

4. 加速度傳感器

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

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

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

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

5. 光傳感器

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

代碼清單5 光線強度等級

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;

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

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

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

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

代碼清單6 獲取傳感器管理器和傳感器對象

//獲取傳感器管理器 SensorManager

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

//獲取加速度傳感器 Sensor

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

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

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

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

SensorEventListener accelerometerListener = new SensorEventListener() {

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

public void onSensorChanged(SensorEvent event) {

//上報的數(shù)據(jù)會保存在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精度被改變時,onAccuracyChanged被調(diào)用

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}, mSensor, SensorManager.SENSOR_DELAY_NORMAL, null);

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

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

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

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

四、開發(fā)案例

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

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

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

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

如下代碼清單9所示:

代碼清單9 定義傳感器事件獲取上報數(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);

/**

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

* 1.獲取特定的傳感器

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

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

* */

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

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

//獲取光傳感器

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

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

/**

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

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

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

* */

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

}

/**

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

* */

class MyListener implements SensorEventListener{

/**

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

* */

@Override

public void onSensorChanged(SensorEvent event) {

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

float[] values = event.values;

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

}

/**

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

* */

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

}

}

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

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

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

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

回到頂部