免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

Android特色開(kāi)發(fā)之傳感器和語(yǔ)音識(shí)別

來(lái)源:網(wǎng)絡(luò)

點(diǎn)擊:2678

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: Android,開(kāi)發(fā),傳感器,語(yǔ)音識(shí)別

      Android特色開(kāi)發(fā)

      Android 是一個(gè)面向應(yīng)用程序開(kāi)發(fā)的豐富平臺(tái),它擁有許多具有吸引力的用戶界面元素、數(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年全球傳感器銷售額為506億美元,預(yù)計(jì)到2010年全球傳感器銷售額可達(dá)600億美元以上。調(diào)查顯示,東歐、亞太區(qū)和加拿大成為傳感器市場(chǎng)增長(zhǎng)最快的地區(qū),而美國(guó)、德國(guó)、日本依舊是傳感器市場(chǎng)分布最大的地區(qū)。就世界范圍而言,傳感器市場(chǎng)增長(zhǎng)最快的領(lǐng)域依舊是汽車,占第二位的是過(guò)程控制,當(dāng)然現(xiàn)在也被廣泛應(yīng)用于通信。那么,傳感器的定義是什么呢?有哪些種類的傳感器呢?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)或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲(chǔ)、顯示、記錄和控制等要求。它是實(shí)現(xiàn)自動(dòng)檢測(cè)和自動(dòng)控制的首要環(huán)節(jié)。

      2.傳感器的種類

      可以從不同的角度對(duì)傳感器進(jìn)行分類:轉(zhuǎn)換原理(傳感器工作的基本物理或化學(xué)效應(yīng));用途;輸出信號(hào)類型以及制作材料和工藝等。

      根據(jù)工作原理,傳感器可分為物理傳感器和化學(xué)傳感器兩大類。

      物理傳感器應(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)。而有些傳感器既不能劃分為物理類,也不能劃分為化學(xué)類。

      3.Android中傳感器的種類

      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è)綜合管理類,包括了傳感器的種類、采樣率、精準(zhǔn)度等。我們可以通過(guò)getSystemService方法來(lái)取得一個(gè)SensorManager對(duì)象。代碼如下:

      SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

      取得SensorManager對(duì)象之后,可以通過(guò)getSensorList方法來(lái)獲得我們需要的傳感器類型,保存到一個(gè)傳感器列表中。通過(guò)如下代碼可以得到一個(gè)方向傳感器:

      Listsensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

      要與傳感器交互,應(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ù),想接收的傳感器類型的列表(即上一步創(chuàng)建的List對(duì)象);第3個(gè)參數(shù),接收頻度。調(diào)用之后返回一個(gè)布爾值,true表示成功,false表示失敗。當(dāng)然,之后不再使用時(shí),我們還需要卸載。代碼如下:

      //注冊(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)

      //這里我們指定類型為T(mén)YPE_ORIENTATION(方向傳感器)

      Listsensors = mSensorManager.getSensorList

      (Sensor.TYPE_ORIENTATION);

      if (sensors.size() > 0)

      {

      Sensor sensor = sensors.get(0);

      //注冊(cè)SensorManager

      //this->接收sensor的實(shí)例

      //接收傳感器類型的列表

      //接收的頻率

      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)

      {

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

      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:得到指定傳感器的列表。

      二 語(yǔ)音識(shí)別

      語(yǔ)音識(shí)別技術(shù)在手機(jī)上應(yīng)用得相當(dāng)廣泛,我們?nèi)粘W铑l繁的溝通方式是語(yǔ)音,在手機(jī)應(yīng)用中,大部分是通過(guò)硬件手動(dòng)輸入,目前這依然是主要與手機(jī)互動(dòng)的方式,然而對(duì)于像手機(jī)這種小巧的移動(dòng)設(shè)備來(lái)說(shuō),使用鍵盤(pán)甚至是虛擬鍵盤(pán)打字是一件非常不爽的事情。于是, Google推出了強(qiáng)大的語(yǔ)音搜索業(yè)務(wù)。2008年11月,Google的語(yǔ)音搜索已經(jīng)在iPhone平臺(tái)上線,而Android在1.5 SDK版本中也加強(qiáng)了語(yǔ)音識(shí)別功能,并應(yīng)用到了搜索功能上,這的確是一個(gè)非常讓人驚喜的更新。我們只需要點(diǎn)擊搜索框旁邊的那個(gè)小話筒形狀的按鈕,如圖9-1所示,Android就可以通過(guò)語(yǔ)音識(shí)別你要搜索的內(nèi)容。如果你的語(yǔ)音不夠清晰,Android也可以通過(guò)大體的意思來(lái)提供一些選擇,其宗旨是最大限度地改善人機(jī)交互的便捷性。相信很快會(huì)有更多人性化的功能出現(xiàn)在Android平臺(tái)上,比如我們?cè)谕嬗螒驎r(shí),可以通過(guò)語(yǔ)音來(lái)控制操作,讓我們期待每一次革新帶給我們的便捷吧!

      

     

      圖1 Android語(yǔ)音識(shí)別按鈕

      Android中主要通過(guò)RecognizerIntent來(lái)實(shí)現(xiàn)語(yǔ)音識(shí)別,它主要包括一些常量來(lái)表示語(yǔ)音的模式等,如表9-1所示。

      表1 RecognizerIntent包括的常量

      

     

      這里我們只需要通過(guò)Intent來(lái)傳遞一個(gè)動(dòng)作以及一些屬性,然后通過(guò)startActivityForResult來(lái)開(kāi)始語(yǔ)音,代碼如下:

      Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_

      MODEL_FREE_FORM);

      intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"開(kāi)始語(yǔ)音");

      startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);

      當(dāng)然,如果找不到設(shè)置,就會(huì)拋出異常ActivityNotFoundException,所以我們需要捕捉這個(gè)異常。當(dāng)然,另外需要實(shí)現(xiàn)onActivityResult方法,當(dāng)語(yǔ)音結(jié)束時(shí),會(huì)觸發(fā)來(lái)獲得語(yǔ)音的字符序列。下面我們通過(guò)一個(gè)例子來(lái)學(xué)習(xí)語(yǔ)音識(shí)別(參見(jiàn)本書(shū)所附代碼:\Examples_09_02),當(dāng)我們點(diǎn)擊“開(kāi)始使用語(yǔ)音識(shí)別”按鈕時(shí),開(kāi)始語(yǔ)音,然后在onActivityResult方法中取得結(jié)果并顯示出來(lái),運(yùn)行效果如圖2所示。由于在模擬器上沒(méi)有設(shè)備,所以顯示了ActivityNotFoundException異常,當(dāng)我們?cè)谡鏅C(jī)上測(cè)試、開(kāi)始語(yǔ)音時(shí),如圖3所示,語(yǔ)音結(jié)束后取出的字符序列如圖4所示。

      

     

      圖2 ActivityNotFoundException異常   圖3 開(kāi)始語(yǔ)音                          圖4 獲取的字符序列

      該例子很簡(jiǎn)單,具體實(shí)現(xiàn)如代碼清單2所示。

     

      代碼清單2 \Examples_09_02\src\com\yarin\android\Examples_09_02\Activity01.java

      public class Activity01 extends Activity

      {

      private static final int VOICE_RECOGNITION_REQUEST_CODE = 4321;

      private ListView mList;

      public void onCreate(Bundle savedInstanceState)

      {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

      mList = (ListView) findViewById(R.id.ListView01);

      Button button = (Button) findViewById(R.id.Button01);

      button.setOnClickListener(new View.OnClickListener()

      {

      @Override

      public void onClick(View v)

      {

      try

      {

      //通過(guò)Intent傳遞語(yǔ)音識(shí)別的模式,開(kāi)啟語(yǔ)音

      Intent intent = new Intent

      (RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

      //語(yǔ)言模式和自由形式的語(yǔ)音識(shí)別

      intent.putExtra(RecognizerIntent.EXTRA_

      LANGUAGE_MODEL,RecognizerIntent.

      LANGUAGE_MODEL_FREE_FORM);

      //提示語(yǔ)音開(kāi)始

      intent.putExtra(RecognizerIntent.EXTRA_

      PROMPT,"開(kāi)始語(yǔ)音");

      //開(kāi)始執(zhí)行我們的Intent、語(yǔ)音識(shí)別

      startActivityForResult(intent,

      VOICE_RECOGNITION_REQUEST_CODE);

      }

      catch (ActivityNotFoundException e)

      {

      //找不到語(yǔ)音設(shè)備裝置

      Toast.makeText(Activity01.this,

      "ActivityNotFoundException",

      Toast.LENGTH_LONG).show();

      }

      }

      });

      }

      //當(dāng)語(yǔ)音結(jié)束時(shí)的回調(diào)函數(shù)onActivityResult

      @Override

      protected void onActivityResult(int requestCode,int resultCode,Intent data)

      {

      // 判斷是否是我們執(zhí)行的語(yǔ)音識(shí)別

      if(requestCode==VOICE_RECOGNITION_REQUEST_CODE&&resultCode==RESULT_OK)

      {

      // 取得語(yǔ)音的字符

      ArrayListresults = data.getStringArrayListExtra

      RecognizerIntent.EXTRA_RESULTS);

      //設(shè)置視圖更新

      //mList.setAdapter(new ArrayAdapter(this,android.

      R.layout.simple_list_item_1,results));

      String resultsString = "";

      for (int i = 0; i < results.size(); i++)

      {

      resultsString += results.get(i);

      }

      Toast.makeText(this,resultsString,Toast.LENGTH_LONG).show();

      super.onActivityResult(requestCode, resultCode, data);

      }

      }

      }

    (審核編輯: 智匯小新)