基於Android的傳感器和語音識別的設計與實現

 Android特色開發

Android是基於Linux內核的操作系統,是Google公司在2007年11月5日公佈的手機操作系統。早期由原名爲”Android”的公司開發,谷歌在2005年收購”Android.Inc”後,繼續進行對Android系統開發運營,它採用了軟件堆層(software stack,又名軟件疊層)的架構,主要分爲三部分。底層Linux內核只提供基本功能,其他的應用軟件則由各公司自行開發,部分程序以Java編寫。Android以Java爲編程語言,從接口到功能,都有層出不窮的變化,其中Activity等同於J2ME的MIDlet,一個 Activity 類(class)負責創建視窗(window),一個活動中的Activity就是在 foreground(前景)模式,背景運行的程序叫做Service.兩者之間通過由ServiceConnection和AIDL連結,達到複數程序同時運行的效果。如果運行中的 Activity 全部畫面被其他 Activity 取代時,該 Activity 便被停止(stopped),甚至被系統清除(kill)。

  一 傳感器

人們爲了從外界獲取信息,必須藉助於感覺器官。而單靠人們自身的感覺器官,在研究自然現象和規律以及生產活動中它們的功能就遠遠不夠了。爲適應這種情況,就需要傳感器。因此可以說,傳感器是人類五官的延長,又稱之爲電五官。新技術革命的到來,世界開始進入信息時代。在利用信息的過程中,首先要解決的就是要獲取準確可靠的信息,而傳感器是獲取自然和生產領域中信息的主要途徑與手段。在現代工業生產尤其是自動化生產過程中,要用各種傳感器來監視和控制生產過程中的各個參數,使設備工作在正常狀態或最佳狀態,並使產品達到最好的質量。因此可以說,沒有衆多的優良的傳感器,現代化生產也就失去了基礎。

據調查,2008年全球傳感器銷售額爲506億美元,預計到2010年全球傳感器銷售額可達600億美元以上。調查顯示,東歐、亞太區和加拿大成爲傳感器市場增長最快的地區,而美國、德國、日本依舊是傳感器市場分佈最大的地區。就世界範圍而言,傳感器市場增長最快的領域依舊是汽車,佔第二位的是過程控制,當然現在也被廣泛應用於通信。

  1.傳感器的定義

傳感器是一種物理裝置或生物器官,能夠探測、感受外界的信號、物理條件(如光、熱、溼度)或化學組成(如煙霧),並將探知的信息傳遞給其他裝置或器官。國家標準GB7665-87對傳感器的定義是:”能感受規定的被測量並按照一定的規律轉換成可用信號的器件或裝置,通常由敏感元件和轉換元件組成”.傳感器是一種檢測裝置,能感受被測量的信息,並能將檢測的感受到的信息,按一定規律變換成爲電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。它是實現自動檢測和自動控制的首要環節。

智能傳感器已廣泛應用於航天、航空、國防、科技和工農業生產等各個領域中。例如,它在機器人領域中有着廣闊應用前景,智能傳感器使機器人具有類人的五官和大腦功能,可感知各種現象,完成各種動作。在工業生產中,利用傳統的傳感器無法對某些產品質量指標(例如,黏度、硬度、表面光潔度、成分、顏色及味道等)進行快速直接測量並在線控制。而利用智能傳感器可直接測量與產品質量指標有函數關係的生產過程中的某些量(如溫度、壓力、流量等)。Cygnus公司生產了一種”葡萄糖手錶”,其外觀像普通手錶一樣,戴上它就能實現無疼、無血、連續的血糖測試。”葡萄糖手錶”上有一塊塗着試劑的墊子,當墊子與皮膚接觸時,葡萄糖分子就被吸附到墊子上,並與試劑發生電化學反應,產生電流。傳感器測量該電流,經處理器計算出與該電流對應的血糖濃度,並以數字量顯示。

  2.傳感器的種類

可以從不同的角度對傳感器進行分類:轉換原理(傳感器工作的基本物理或化學效應);用途;輸出信號類型以及製作材料和工藝等。

根據工作原理,傳感器可分爲物理傳感器和化學傳感器兩大類。

物理傳感器應用的是物理效應,諸如壓電效應,磁致伸縮現象,離化、極化、熱電、光電、磁電等效應。被測信號量的微小變化都將轉換成電信號。

化學傳感器包括那些以化學吸附、電化學反應等現象爲因果關係的傳感器,被測信號量的微小變化也將轉換成電信號。

大多數傳感器是以物理原理爲基礎運作的。化學傳感器的技術問題較多,例如可靠性問題、規模生產的可能性、價格問題等,解決了這些問題,化學傳感器的應用將會有巨大增長。而有些傳感器既不能劃分爲物理類,也不能劃分爲化學類。

  3.Android中傳感器的種類

Google Android操作系統中內置了很多傳感器,在部分遊戲或軟件中可以自動識別屏幕的橫屏、豎屏方向來改變屏幕顯示佈局。下面是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中傳感器的使用(具體實現參見本書所附代碼:第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);

要與傳感器交互,應用程序必須註冊以偵聽與一個或多個傳感器相關的活動。Android中提供了registerListener來註冊一個傳感器,並提供了unregisterListener來卸載一個傳感器。registerListener方法包括3個參數:第1個參數,接收信號的Listener實例;第2個參數,想接收的傳感器類型的列表(即上一步創建的List對象);第3個參數,接收頻度。調用之後返回一個布爾值,true表示成功,false表示失敗。代碼如下:

//註冊傳感器

Boolean mRegisteredSensor = mSensorManager.registerListener(this, sensor,

SensorManager.SENSOR_DELAY_FASTEST);

//卸載傳感器

mSensorManager.unregisterListener(this);

其中,SensorEventListener是使用傳感器的核心部分,包括以下兩個方法必須實現:

onSensorChanged (SensorEvent event) 方法在傳感器值更改時調用。該方法只由受此應用程序監視的傳感器調用。該方法的參數包括一個SensorEvent對象,該對象主要包括一組浮點數,表示傳感器獲得的方向、加速度等信息。例如,以下代碼可以取得其值:

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) 方法在傳感器的精準度發生改變時調用。其參數包括兩個整數:一個表示傳感器,另一個表示該傳感器新的準確值。

具體實現如代碼清單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)

{

//如果調用了registerListener

//這裏我們需要unregisterListener來卸載/取消註冊

mSensorManager.unregisterListener(this);

mRegisteredSensor = false;

}

super.onPause();

}

//當精準度發生改變時

//sensor->傳感器

//accuracy->精準度

public void onAccuracyChanged(Sensor sensor, int accuracy)

{

//處理精準度改變

}

// 當傳感器在被改變時觸發

public void onSensorChanged(SensorEvent event)

{

// 接收方向傳感器的類型

if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)

{

//這裏我們可以得到數據,然後根據需要來處理

//由於模擬器上面無法測試效果,因此我們暫時不處理數據

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

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

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

}

}

}

上面的例子中演示瞭如何獲得方向傳感器的方向、加速度等信息,我們可以根據得到的數值與上一次得到的數值之間的關係來進行需要的操作。SensorManager中還有很多常量和一些常用的方法,如下:

getDefaultSensor:得到默認的傳感器對象。

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

getOrientation:得到設備旋轉的方向。

getSensorList:得到指定傳感器的列表。

 

參考文章:http://www.dzsc.com/data/html/2011-9-3/97301.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章