基于Android的傳感器和語音識別的設(shè)計與實現(xiàn)
出處:yul313 發(fā)布于:2011-09-03 09:42:38
Android特色開發(fā)
Android是基于Linux內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機操作系統(tǒng)。早期由原名為"Android"的公司開發(fā),谷歌在2005年收購"Android.Inc"后,繼續(xù)進行對Android系統(tǒng)開發(fā)運營,它采用了軟件堆層(software stack,又名軟件疊層)的架構(gòu),主要分為三部分。底層Linux內(nèi)核只提供基本功能,其他的應(yīng)用軟件則由各公司自行開發(fā),部分程序以Java編寫。Android以Java為編程語言,從接口到功能,都有層出不窮的變化,其中Activity等同于J2ME的MIDlet,一個 Activity 類(class)負責(zé)創(chuàng)建視窗(window),一個活動中的Activity就是在 foreground(前景)模式,背景運行的程序叫做Service.兩者之間通過由ServiceConnection和AIDL連結(jié),達到復(fù)數(shù)程序同時運行的效果。如果運行中的 Activity 全部畫面被其他 Activity 取代時,該 Activity 便被停止(stopped),甚至被系統(tǒng)清除(kill)。
一 傳感器
人們?yōu)榱藦耐饨绔@取信息,必須借助于感覺器官。而單靠人們自身的感覺器官,在研究自然現(xiàn)象和規(guī)律以及生產(chǎn)活動中它們的功能就遠遠不夠了。為適應(yīng)這種情況,就需要傳感器。因此可以說,傳感器是人類五官的延長,又稱之為電五官。新技術(shù)革命的到來,世界開始進入信息時代。在利用信息的過程中,首先要解決的就是要獲取準確可靠的信息,而傳感器是獲取自然和生產(chǎn)領(lǐng)域中信息的主要途徑與手段。在現(xiàn)代工業(yè)生產(chǎn)尤其是自動化生產(chǎn)過程中,要用各種傳感器來監(jiān)視和控制生產(chǎn)過程中的各個參數(shù),使設(shè)備工作在正常狀態(tài)或狀態(tài),并使產(chǎn)品達到的質(zhì)量。因此可以說,沒有眾多的優(yōu)良的傳感器,現(xiàn)代化生產(chǎn)也就失去了基礎(chǔ)。
據(jù)調(diào)查,2008年傳感器銷售額為506億美元,預(yù)計到2010年傳感器銷售額可達600億美元以上。調(diào)查顯示,東歐、亞太區(qū)和加拿大成為傳感器市場增長快的地區(qū),而美國、德國、日本依舊是傳感器市場分布的地區(qū)。就世界范圍而言,傳感器市場增長快的領(lǐng)域依舊是汽車,占第二位的是過程控制,當然現(xiàn)在也被廣泛應(yīng)用于通信。
1.傳感器的定義
傳感器是一種物理裝置或生物器官,能夠探測、感受外界的信號、物理條件(如光、熱、濕度)或化學(xué)組成(如煙霧),并將探知的信息傳遞給其他裝置或器官。國家標準GB7665-87對傳感器的定義是:"能感受規(guī)定的被測量并按照一定的規(guī)律轉(zhuǎn)換成可用信號的器件或裝置,通常由敏感元件和轉(zhuǎn)換元件組成".傳感器是一種檢測裝置,能感受被測量的信息,并能將檢測的感受到的信息,按一定規(guī)律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。它是實現(xiàn)自動檢測和自動控制的首要環(huán)節(jié)。
智能傳感器已廣泛應(yīng)用于航天、航空、國防、科技和工農(nóng)業(yè)生產(chǎn)等各個領(lǐng)域中。例如,它在機器人領(lǐng)域中有著廣闊應(yīng)用前景,智能傳感器使機器人具有類人的五官和大腦功能,可感知各種現(xiàn)象,完成各種動作。在工業(yè)生產(chǎn)中,利用傳統(tǒng)的傳感器無法對某些產(chǎn)品質(zhì)量指標(例如,黏度、硬度、表面光潔度、成分、顏色及味道等)進行快速直接測量并在線控制。而利用智能傳感器可直接測量與產(chǎn)品質(zhì)量指標有函數(shù)關(guān)系的生產(chǎn)過程中的某些量(如溫度、壓力、流量等)。Cygnus公司生產(chǎn)了一種"葡萄糖手表",其外觀像普通手表一樣,戴上它就能實現(xiàn)無疼、無血、連續(xù)的血糖測試。"葡萄糖手表"上有一塊涂著試劑的墊子,當墊子與皮膚接觸時,葡萄糖分子就被吸附到墊子上,并與試劑發(fā)生電化學(xué)反應(yīng),產(chǎn)生電流。傳感器測量該電流,經(jīng)處理器計算出與該電流對應(yīng)的血糖濃度,并以數(shù)字量顯示。
2.傳感器的種類
可以從不同的角度對傳感器進行分類:轉(zhuǎn)換原理(傳感器工作的基本物理或化學(xué)效應(yīng));用途;輸出信號類型以及制作材料和工藝等。
根據(jù)工作原理,傳感器可分為物理傳感器和化學(xué)傳感器兩大類。
物理傳感器應(yīng)用的是物理效應(yīng),諸如壓電效應(yīng),磁致伸縮現(xiàn)象,離化、極化、熱電、光電、磁電等效應(yīng)。被測信號量的微小變化都將轉(zhuǎn)換成電信號。
化學(xué)傳感器包括那些以化學(xué)吸附、電化學(xué)反應(yīng)等現(xiàn)象為因果關(guān)系的傳感器,被測信號量的微小變化也將轉(zhuǎn)換成電信號。
大多數(shù)傳感器是以物理原理為基礎(chǔ)運作的。化學(xué)傳感器的技術(shù)問題較多,例如可靠性問題、規(guī)模生產(chǎn)的可能性、價格問題等,解決了這些問題,化學(xué)傳感器的應(yīng)用將會有巨大增長。而有些傳感器既不能劃分為物理類,也不能劃分為化學(xué)類。
3.Android中傳感器的種類
Google Android操作系統(tǒng)中內(nèi)置了很多傳感器,在部分游戲或軟件中可以自動識別屏幕的橫屏、豎屏方向來改變屏幕顯示布局。下面是Android中支持的幾種傳感器:
Sensor.TYPE_ACCELEROMETER:加速度傳感器。
Sensor.TYPE_GYROSCOPE:陀螺儀傳感器。
Sensor.TYPE_LIGHT:亮度傳感器。
Sensor.TYPE_MAGNETIC_FIELD:地磁傳感器。
Sensor.TYPE_ORIENTATION:方向傳感器。
Sensor.TYPE_PRESSURE:壓力傳感器。
Sensor.TYPE_PROXIMITY:近程傳感器。
Sensor.TYPE_TEMPERATURE:溫度傳感器。
下面我們通過一個例子來分析Android中傳感器的使用(具體實現(xiàn)參見本書所附代碼:第9章\ Examples_09_01),這里分析的是方向傳感器(TYPE_ORIENTATION)。
4.Android 中傳感器的功能
要在Android中使用傳感器,首先需要了解SensorManager和SensorEventListener.顧名思義,SensorManager就是所有傳感器的一個綜合管理類,包括了傳感器的種類、采樣率、精準度等。我們可以通過getSystemService方法來取得一個SensorManager對象。代碼如下:
SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
取得SensorManager對象之后,可以通過getSensorList方法來獲得我們需要的傳感器類型,保存到一個傳感器列表中。通過如下代碼可以得到一個方向傳感器:
List sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
要與傳感器交互,應(yīng)用程序必須注冊以偵聽與一個或多個傳感器相關(guān)的活動。Android中提供了registerListener來注冊一個傳感器,并提供了unregisterListener來卸載一個傳感器。registerListener方法包括3個參數(shù):第1個參數(shù),接收信號的Listener實例;第2個參數(shù),想接收的傳感器類型的列表(即上一步創(chuàng)建的List對象);第3個參數(shù),接收頻度。調(diào)用之后返回一個布爾值,true表示成功,false表示失敗。代碼如下:
//注冊傳感器
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ù),表示傳感器獲得的方向、加速度等信息。例如,以下代碼可以取得其值:
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) 方法在傳感器的精準度發(fā)生改變時調(diào)用。其參數(shù)包括兩個整數(shù):一個表示傳感器,另一個表示該傳感器新的準確值。
具體實現(xiàn)如代碼清單1所示。
代碼清單1 \Examples_09_01\src\com\yarin\android\Examples_09_01\Activity01.java
public class Activity01 extends Activity implements SensorEventListener
{
private boolean mRegisteredSensor;
//定義SensorManager
private SensorManager mSensorManager;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mRegisteredSensor = false;
//取得SensorManager實例
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
protected void onResume()
{
super.onResume();
//接收SensorManager的一個列表(Listener)
//這里我們指定類型為TYPE_ORIENTATION(方向傳感器)
List sensors = mSensorManager.getSensorList
(Sensor.TYPE_ORIENTATION);
if (sensors.size() > 0)
{
Sensor sensor = sensors.get(0);
//注冊SensorManager
//this->接收sensor的實例
//接收傳感器類型的列表
//接收的頻率
mRegisteredSensor = mSensorManager.registerListener(this,
sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
}
protected void onPause()
{
if (mRegisteredSensor)
{
//如果調(diào)用了registerListener
//這里我們需要unregisterListener來卸載/取消注冊
mSensorManager.unregisterListener(this);
mRegisteredSensor = false;
}
super.onPause();
}
//當精準度發(fā)生改變時
//sensor->傳感器
//accuracy->精準度
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
//處理精準度改變
}
// 當傳感器在被改變時觸發(fā)
public void onSensorChanged(SensorEvent event)
{
// 接收方向傳感器的類型
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
//這里我們可以得到數(shù)據(jù),然后根據(jù)需要來處理
//由于模擬器上面無法測試效果,因此我們暫時不處理數(shù)據(jù)
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
}
}
}
上面的例子中演示了如何獲得方向傳感器的方向、加速度等信息,我們可以根據(jù)得到的數(shù)值與上得到的數(shù)值之間的關(guān)系來進行需要的操作。SensorManager中還有很多常量和一些常用的方法,如下:
getDefaultSensor:得到默認的傳感器對象。
getInclination:得到地磁傳感器傾斜角的弧度值。
getOrientation:得到設(shè)備旋轉(zhuǎn)的方向。
getSensorList:得到指定傳感器的列表。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 數(shù)字電源控制與傳統(tǒng)模擬控制的深度對比2026/2/2 11:06:56
- 模擬信號調(diào)理電路技術(shù)設(shè)計與選型運維指南2025/12/30 10:08:16
- 運算放大器壓擺率的核心要點2025/9/5 16:27:55
- 深度剖析放大器穩(wěn)定系數(shù) K 與 Mu 的差異2025/9/2 16:44:05
- 什么是運算放大器失調(diào)電流2025/9/1 17:01:22









