Android特色開發之傳感器和語音識別
Android 是一個面向應用程序開發的豐富平臺,它擁有許多具有吸引力的用戶界面元素、數據管理和網絡應用等優秀的功能。Android 還提供了很多頗具特色的接口。本文我們將分別介紹這些吸引開發者眼球的特色開發,主要包括:傳感器系統(Sensor)、語音識別技術 (RecognizerIntent)、Google Map和用來開發桌面的插件(Widget)。通過本文的學習,讀者將對Android有一個更深入的了解,可以開發出一些有特色、有創意的應用程序。
一 傳感器
據調查,2008年全球傳感器銷售額為506億美元,預計到2010年全球傳感器銷售額可達600億美元以上。調查顯示,東歐、亞太區和加拿大成為傳感器市場增長最快的地區,而美國、德國、日本依舊是傳感器市場分布最大的地區。就世界范圍而言,傳感器市場增長最快的領域依舊是汽車,占第二位的是過程控制,當然現在也被廣泛應用于通信。那么,傳感器的定義是什么呢?有哪些種類的傳感器呢?Android中提供了哪些傳感器呢?
1.傳感器的定義
傳感器是一種物理裝置或生物器官,能夠探測、感受外界的信號、物理條件(如光、熱、濕度)或化學組成(如煙霧),并將探知的信息傳遞給其他裝置或器官。國家標準GB7665—87對傳感器的定義是:“能感受規定的被測量并按照一定的規律轉換成可用信號的器件或裝置,通常由敏感元件和轉換元件組成”。傳感器是一種檢測裝置,能感受被測量的信息,并能將檢測的感受到的信息,按一定規律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。它是實現自動檢測和自動控制的首要環節。
2.傳感器的種類
可以從不同的角度對傳感器進行分類:轉換原理(傳感器工作的基本物理或化學效應);用途;輸出信號類型以及制作材料和工藝等。
根據工作原理,傳感器可分為物理傳感器和化學傳感器兩大類。
物理傳感器應用的是物理效應,諸如壓電效應,磁致伸縮現象,離化、極化、熱電、光電、磁電等效應。被測信號量的微小變化都將轉換成電信號。
化學傳感器包括那些以化學吸附、電化學反應等現象為因果關系的傳感器,被測信號量的微小變化也將轉換成電信號。
大多數傳感器是以物理原理為基礎運作的。化學傳感器的技術問題較多,例如可靠性問題、規模生產的可能性、價格問題等,解決了這些問題,化學傳感器的應用將會有巨大增長。而有些傳感器既不能劃分為物理類,也不能劃分為化學類。
3.Android中傳感器的種類
Google Android操作系統中內置[FS:PAGE]了很多傳感器,比如G1自帶了一個非常實用的加速感應器(微型陀螺儀),有了它,G1手機就支持重力感應、方向判斷等功能,在部分游戲或軟件中可以自動識別屏幕的橫屏、豎屏方向來改變屏幕顯示布局。下面是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 (Sens[FS:PAGE]orEvent 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_01srccomyarinandroidExamples_09_01Activity01.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)
{
/[FS:PAGE]/處理精準度改變
}
// 當傳感器在被改變時觸發
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:得到指定傳感器的列表。
相關文章
傳感器如何監控橋梁以保證安全
橋梁對我們的基礎設施至關重要,需要定期維護,以確保汽車、卡車、軌道和經常通過橋梁的人的安全。許多橋梁已經使用了50年甚至更久,每天都有市民在結構缺陷的橋梁上行走。IEEE資深成員ClintAndrews說:“橋梁的結構健康監測...
智慧城市建設步伐加快 傳感器產業機遇與挑戰并存
智慧城市的出現是基于2008年IBM提出的“智慧地球”理念,隨后引發了智慧城市建設的熱潮。2012年,我國就已經開始了智慧城市的試點工作。2014年時政府正式印發了《關于促進智慧城市健康發展的指導意見》,計劃到2020年建...
超聲波傳感器的應用分析
眼下,國外許多汽車制造商和技術公司都在測試具備完全自動駕駛功能的自動駕駛汽車。日產、通用汽車甚至表示,到2020年,他們將在道路上試運行自動駕駛汽車,這兩種自動駕駛汽車以及結合了駕駛員輔助技術的人類駕駛汽車,都要廣泛使用傳...
工業物聯網傳感器如何改善制造業
2018年第四季度,制造業為美國經濟貢獻了2.38萬億美元,雇傭了1200多萬工人,占當年美國國內生產總值的11.4%。盡管所有媒體都對制造業地位的下降感到擔憂,但由于關鍵技術的進步,該行業近年來蓬勃發展。而工業物聯網(I...
2026年全球農業傳感器市場將達到25.6億美元
2018年全球農業傳感器市場價值為12.3億美元,預計到2026年將達到25.6億美元,復合年增長率為11.04%。傳感技術用于精密農業,可提供有助于農民監測和優化農作物以及適應不斷變化的環境因素的數據。這提供了可操作的數...