Android特色開(kāi)發(fā)
Android 是一個(gè)面向應(yīng)用程序開(kāi)發(fā)的豐富平臺(tái),它擁有許多具有吸引力的用戶(hù)界面元素、數(shù)據(jù)管理和網(wǎng)絡(luò)應(yīng)用等優(yōu)秀的功能,。Android 還提供了很多頗具特色的接口,。本文我們將分別介紹這些吸引開(kāi)發(fā)者眼球的特色開(kāi)發(fā),主要包括:傳感器系統(tǒng)(Sensor),、語(yǔ)音識(shí)別技術(shù)(RecognizerIntent),、Google Map和用來(lái)開(kāi)發(fā)桌面的插件(Widget)。通過(guò)本文的學(xué)習(xí),,讀者將對(duì)Android有一個(gè)更深入的了解,,可以開(kāi)發(fā)出一些有特色、有創(chuàng)意的應(yīng)用程序,。
一 傳感器
據(jù)調(diào)查,,2008年全球傳感器銷(xiāo)售額為506億美元,預(yù)計(jì)到2010年全球傳感器銷(xiāo)售額可達(dá)600億美元以上,。調(diào)查顯示,,東歐、亞太區(qū)和加拿大成為傳感器市場(chǎng)增長(zhǎng)最快的地區(qū),,而美國(guó),、德國(guó)、日本依舊是傳感器市場(chǎng)分布最大的地區(qū),。就世界范圍而言,,傳感器市場(chǎng)增長(zhǎng)最快的領(lǐng)域依舊是汽車(chē),占第二位的是過(guò)程控制,,當(dāng)然現(xiàn)在也被廣泛應(yīng)用于通信,。那么,傳感器的定義是什么呢?有哪些種類(lèi)的傳感器呢?Android中提供了哪些傳感器呢?
1.傳感器的定義
傳感器是一種物理裝置或生物器官,,能夠探測(cè),、感受外界的信號(hào)、物理?xiàng)l件(如光,、熱,、濕度)或化學(xué)組成(如煙霧),并將探知的信息傳遞給其他裝置或器官,。國(guó)家標(biāo)準(zhǔn)GB7665—87對(duì)傳感器的定義是:“能感受規(guī)定的被測(cè)量并按照一定的規(guī)律轉(zhuǎn)換成可用信號(hào)的器件或裝置,,通常由敏感元件和轉(zhuǎn)換元件組成”。傳感器是一種檢測(cè)裝置,,能感受被測(cè)量的信息,,并能將檢測(cè)的感受到的信息,按一定規(guī)律變換成為電信號(hào)或其他所需形式的信息輸出,,以滿(mǎn)足信息的傳輸,、處理,、存儲(chǔ)、顯示,、記錄和控制等要求。它是實(shí)現(xiàn)自動(dòng)檢測(cè)和自動(dòng)控制的首要環(huán)節(jié),。
2.傳感器的種類(lèi)
可以從不同的角度對(duì)傳感器進(jìn)行分類(lèi):轉(zhuǎn)換原理(傳感器工作的基本物理或化學(xué)效應(yīng));用途;輸出信號(hào)類(lèi)型以及制作材料和工藝等,。
根據(jù)工作原理,傳感器可分為物理傳感器和化學(xué)傳感器兩大類(lèi),。
物理傳感器應(yīng)用的是物理效應(yīng),,諸如壓電效應(yīng),磁致伸縮現(xiàn)象,,離化,、極化、熱電,、光電,、磁電等效應(yīng)。被測(cè)信號(hào)量的微小變化都將轉(zhuǎn)換成電信號(hào),。
化學(xué)傳感器包括那些以化學(xué)吸附,、電化學(xué)反應(yīng)等現(xiàn)象為因果關(guān)系的傳感器,被測(cè)信號(hào)量的微小變化也將轉(zhuǎn)換成電信號(hào),。
大多數(shù)傳感器是以物理原理為基礎(chǔ)運(yùn)作的,。化學(xué)傳感器的技術(shù)問(wèn)題較多,,例如可靠性問(wèn)題,、規(guī)模生產(chǎn)的可能性、價(jià)格問(wèn)題等,,解決了這些問(wèn)題,,化學(xué)傳感器的應(yīng)用將會(huì)有巨大增長(zhǎng)。而有些傳感器既不能劃分為物理類(lèi),,也不能劃分為化學(xué)類(lèi),。
3.Android中傳感器的種類(lèi)
Google Android操作系統(tǒng)中內(nèi)置了很多傳感器,比如G1自帶了一個(gè)非常實(shí)用的加速感應(yīng)器(微型陀螺儀),,有了它,,G1手機(jī)就支持重力感應(yīng)、方向判斷等功能,,在部分游戲或軟件中可以自動(dòng)識(shí)別屏幕的橫屏,、豎屏方向來(lá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:溫度傳感器,。
下面我們通過(guò)一個(gè)例子來(lái)分析Android中傳感器的使用(具體實(shí)現(xiàn)參見(jiàn)本書(shū)所附代碼:第9章\ Examples_09_01),,這里分析的是方向傳感器(TYPE_ORIENTATION)。
4.Android 中傳感器的功能
要在Android中使用傳感器,,首先需要了解SensorManager和SensorEventListener,。顧名思義,SensorManager就是所有傳感器的一個(gè)綜合管理類(lèi),,包括了傳感器的種類(lèi),、采樣率、精準(zhǔn)度等,。我們可以通過(guò)getSystemService方法來(lái)取得一個(gè)SensorManager對(duì)象,。代碼如下:
SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
取得SensorManager對(duì)象之后,可以通過(guò)getSensorList方法來(lái)獲得我們需要的傳感器類(lèi)型,,保存到一個(gè)傳感器列表中,。通過(guò)如下代碼可以得到一個(gè)方向傳感器:
List
要與傳感器交互,應(yīng)用程序必須注冊(cè)以偵聽(tīng)與一個(gè)或多個(gè)傳感器相關(guān)的活動(dòng),。Android中提供了registerListener來(lái)注冊(cè)一個(gè)傳感器,,并提供了unregisterListener來(lái)卸載一個(gè)傳感器。registerListener方法包括3個(gè)參數(shù):第1個(gè)參數(shù),,接收信號(hào)的Listener實(shí)例;第2個(gè)參數(shù),,想接收的傳感器類(lèi)型的列表(即上一步創(chuàng)建的List
//注冊(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ù),,表示傳感器獲得的方向,、加速度等信息,。例如,以下代碼可以取得其值:
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)確值。
具體實(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實(shí)例
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
protected void onResume()
{
super.onResume();
//接收SensorManager的一個(gè)列表(Listener)
//這里我們指定類(lèi)型為T(mén)YPE_ORIENTATION(方向傳感器)
List
(Sensor.TYPE_ORIENTATION);
if (sensors.size() > 0)
{
Sensor sensor = sensors.get(0);
//注冊(cè)SensorManager
//this->接收sensor的實(shí)例
//接收傳感器類(lèi)型的列表
//接收的頻率
mRegisteredSensor = mSensorManager.registerListener(this,
sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
}
protected void onPause()
{
if (mRegisteredSensor)
{
//如果調(diào)用了registerListener
//這里我們需要unregisterListener來(lái)卸載/取消注冊(cè)
mSensorManager.unregisterListener(this);
mRegisteredSensor = false;
}
super.onPause();
}
//當(dāng)精準(zhǔn)度發(fā)生改變時(shí)
//sensor->傳感器
//accuracy->精準(zhǔn)度
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
//處理精準(zhǔn)度改變
}
// 當(dāng)傳感器在被改變時(shí)觸發(fā)
public void onSensorChanged(SensorEvent event)
{
// 接收方向傳感器的類(lèi)型
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
//這里我們可以得到數(shù)據(jù),,然后根據(jù)需要來(lái)處理
//由于模擬器上面無(wú)法測(cè)試效果,因此我們暫時(shí)不處理數(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)系來(lái)進(jìn)行需要的操作,。SensorManager中還有很多常量和一些常用的方法,,如下:
getDefaultSensor:得到默認(rèn)的傳感器對(duì)象。
getInclination:得到地磁傳感器傾斜角的弧度值,。
getOrientation:得到設(shè)備旋轉(zhuǎn)的方向,。
getSensorList:得到指定傳感器的列表。