您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>傳感器>

淺談Android傳感器開(kāi)發(fā)之磁傳感器

2018年10月07日 11:52 網(wǎng)絡(luò)整理 作者:工程師譚軍 用戶評(píng)論(0
  磁傳感器
?
  磁傳感器是把磁場(chǎng)、電流、應(yīng)力應(yīng)變、溫度、光等外界因素引起敏感元件磁性能變化轉(zhuǎn)換成電信號(hào),以這種方式來(lái)檢測(cè)相應(yīng)物理量的器件。
?
  磁傳感器廣泛用于現(xiàn)代工業(yè)電子產(chǎn)品中以感應(yīng)磁場(chǎng)強(qiáng)度來(lái)測(cè)量電流、位置、方向等物理參數(shù)。在現(xiàn)有技術(shù)中,有許多不同類型的傳感器用于測(cè)量磁場(chǎng)和其他參數(shù)。
?
  磁傳感器是把磁場(chǎng)、電流、應(yīng)力應(yīng)變、溫度、光等外界因素引起敏感元件磁性能變化轉(zhuǎn)換成電信號(hào),以這種方式來(lái)檢測(cè)相應(yīng)物理量的器件。磁傳感器分為三類:指南針、磁場(chǎng)感應(yīng)器、位置傳感器。指南針:地球會(huì)產(chǎn)生磁場(chǎng),如果你能測(cè)地球表面磁場(chǎng)就可以做指南針。電流傳感器:電流傳感器也是磁場(chǎng)傳感器。電流傳感器可以用在家用電器、智能電網(wǎng)、電動(dòng)車、風(fēng)力發(fā)電等等。位置傳感器: 如果一個(gè)磁體和磁傳感器相互之間有位置變化,這個(gè)位置變化是線性的就是線性傳感器,如果轉(zhuǎn)動(dòng)的就是轉(zhuǎn)動(dòng)傳感器。
?
  大生活中用到很多磁傳感器,比如說(shuō)指南針,電腦硬盤、家用電器等等。
?
  在傳統(tǒng)產(chǎn)業(yè)改造中的應(yīng)用及市場(chǎng)
?
  據(jù)報(bào)道,1995年僅工業(yè)過(guò)程控制傳感器的全球市場(chǎng)已達(dá)到260億美元;2001年計(jì)算機(jī)HDD用SV-GMR磁頭的市場(chǎng)超過(guò)了4000億日元(約合34億美元)。若采用新型微型磁傳感器,既使操作更簡(jiǎn)便,又提高了可靠性,增長(zhǎng)了器件壽命,降低了成本。
?
  使用新型磁傳感器可以顯著提高測(cè)量和控制精度,如使用GMI(巨磁阻抗)磁場(chǎng)傳感器,檢測(cè)分辨率和常用磁通門磁強(qiáng)計(jì)一樣,而響應(yīng)速度卻快了一倍,消耗功率僅為后者的1%;若用霍爾器件,其分辨率僅4A/m,而所需外場(chǎng)比前者高300余倍;在應(yīng)力檢測(cè)中,SI 傳感器的靈敏度是常用電阻絲的2000倍高,是半導(dǎo)體應(yīng)變規(guī)的20~40倍。工業(yè)機(jī)床的油壓或氣壓汽缸活塞位置檢測(cè),廣泛采用套在活塞桿上的永磁環(huán)和AMR元件組成的磁傳感器,檢測(cè)精度達(dá)0.1mm,檢測(cè)速度可在0~500mm/s內(nèi)以高低速度變換;改用GMI或SV-GMR傳感器后,測(cè)量精度至少可以提高1個(gè)數(shù)量級(jí)。在機(jī)床數(shù)控化時(shí)代,數(shù)字磁尺幫助設(shè)計(jì)師們實(shí)現(xiàn)了閉環(huán)控制。使用絕對(duì)信號(hào)輸出的磁尺,則不受噪聲、電源電壓波動(dòng)等干擾,也不必原點(diǎn)復(fù)位。使用工作狀態(tài)磁敏開(kāi)關(guān),還可以完成手動(dòng)與數(shù)控之間的轉(zhuǎn)換。
?
  旋轉(zhuǎn)磁編碼器在旋轉(zhuǎn)量的檢測(cè)控制中起關(guān)鍵作用,它在數(shù)控機(jī)床、機(jī)器人、工廠自動(dòng)化設(shè)備的位置檢測(cè)、傳輸速度控制,磁盤、打印機(jī)之類的自動(dòng)化設(shè)備通訊設(shè)備的旋轉(zhuǎn)量檢測(cè)中都是不可缺少的重要部件。其檢測(cè)對(duì)象是光磁圖形,不受油霧粉塵的影響,因此比目前最先進(jìn)的光編碼器的可靠性高壽命長(zhǎng),尤其適合于自動(dòng)焊接、油漆機(jī)器人和與鋼鐵有關(guān)的位置檢測(cè)以及各種金屬、木材、塑料等加工行業(yè)的應(yīng)用。而仍大量使用光編碼器,由于這種器件易受粉塵、油污和煙霧的影響,用在自動(dòng)焊接、油漆機(jī)器人、紡織和鋼鐵、木料、塑料等的加工中,可靠性極差。應(yīng)用AMR、GMR 、GMI敏感元件構(gòu)成的旋轉(zhuǎn)磁編碼器,就不存在上述缺點(diǎn),因此,它們的市場(chǎng)需求年增長(zhǎng)率在30%以上。在家用電器和節(jié)能產(chǎn)品中也也有其廣泛的應(yīng)用潛力,在節(jié)能環(huán)保產(chǎn)品中也大有用武之地。若使用微型磁編碼器和控制微機(jī)一體化,更有利于簡(jiǎn)化控制系統(tǒng)結(jié)構(gòu),減少元件數(shù)和占空體積,這在精密制造和加工業(yè)中意義十分重大。
?
  在環(huán)境監(jiān)測(cè)中的應(yīng)用
?
  環(huán)境保護(hù)的前提是對(duì)各個(gè)環(huán)境參數(shù)(溫度、氣壓、大氣成份、噪聲。..。..。)的監(jiān)測(cè),這里需要使用多種大量的傳感器。采用強(qiáng)磁致伸縮非晶磁彈微型磁傳感器,可以同時(shí)測(cè)量真空或密閉空間的溫度和氣壓,而且不用接插件,可以遙測(cè)和遠(yuǎn)距離訪問(wèn)。在食品包裝、環(huán)境科學(xué)實(shí)驗(yàn)等方面,應(yīng)用前景廣闊。
?
  在交通管制中的應(yīng)用
?
  交通事故和交通阻塞是城市中和城市間交通存在的一個(gè)大問(wèn)題。國(guó)內(nèi)外都在加強(qiáng)高速公路行車支持道路系統(tǒng)(AHS)、智能運(yùn)輸系統(tǒng)(ITS)和道路交通信息系統(tǒng)(VICS)等的開(kāi)發(fā)與建設(shè)。在這些新系統(tǒng)中,高靈敏度、高速響應(yīng)微型磁傳感器大有用武之地。例如,用分辨率可達(dá)1nT的GMI和SI傳感器,可構(gòu)成ITS傳感器(作高速路上的道路標(biāo)志,測(cè)車輪角度,貨車近接距離),汽車通過(guò)記錄儀(測(cè)通行方向、速度、車身長(zhǎng)度、車種識(shí)別),停車場(chǎng)成批車輛傳感器,加速度傳感器(測(cè)車輛通過(guò)時(shí)路橋的振動(dòng)等)。
?
  磁傳感器在電子羅盤中的應(yīng)用
?
  幾個(gè)世紀(jì)以來(lái),人們?cè)趯?dǎo)航中一直使用磁羅盤。有資料顯示早在二千多年前中國(guó)人就開(kāi)始使用天然磁石-一種磁鐵礦來(lái)指示水平方向。電子羅盤(數(shù)字羅盤,電子指南針,數(shù)字指南針)是測(cè)量方位角(航向角)比較經(jīng)濟(jì)的一種電子儀器。如今電子指南針廣泛應(yīng)用于汽車和手持電子羅盤,手表,手機(jī),對(duì)講機(jī),雷達(dá)探測(cè)器,望遠(yuǎn)鏡,探星儀,穆斯林麥加探測(cè)器(穆斯林鐘),手持 GPS 系統(tǒng),尋路器,武器/導(dǎo)彈導(dǎo)航( 航位推測(cè) ),位置/方位系統(tǒng),安全/定位設(shè)備,汽車、航海和航空的高性能導(dǎo)航設(shè)備,電子游戲機(jī)設(shè)備等需要方向或姿態(tài)顯示的設(shè)備。
?
  地球本身是一個(gè)大磁鐵,地球表面的磁場(chǎng)大約為0.5Oe,地磁場(chǎng)平行地球表面并始終指向北方。利用GMR薄膜可做成用來(lái)探測(cè)地磁場(chǎng)的傳感器。圖5顯示這種傳感器的具體工作原理。我們可以制出能夠探測(cè)磁場(chǎng)X和Y方向分量的集成GMR傳感器。此傳感器可作為羅盤并應(yīng)用在各種交通工具上作為導(dǎo)航裝置。美國(guó)的NVE公司已經(jīng)把GMR傳感器用在車輛的交通控制系統(tǒng)上。例如,放置在高速公路邊的GMR傳感器可以計(jì)算和區(qū)別通過(guò)傳感器的車輛。如果同時(shí)分開(kāi)放置兩個(gè)GMR傳感器,還可以探測(cè)出通過(guò)車輛的速度和車輛的長(zhǎng)度,當(dāng)然GMR也可用在公路的收費(fèi)亭,從而實(shí)現(xiàn)收費(fèi)的自動(dòng)控制。另外高靈敏度和低磁場(chǎng)的傳感器可以用在航空、航天及衛(wèi)星通信技術(shù)上。大家知道,在軍事工業(yè)中隨著吸波技術(shù)的發(fā)展,軍事物件可以通過(guò)覆蓋一層吸波材料而隱蔽,但是它們無(wú)論如何都會(huì)產(chǎn)生磁場(chǎng),因此通過(guò)GMR磁場(chǎng)傳感器可以把隱蔽的物體找出來(lái)。當(dāng)然,GMR磁場(chǎng)傳感器可以應(yīng)用在衛(wèi)星上,用來(lái)探測(cè)地球表面上的物體和底下的礦藏分布。
?
  門磁傳感器在智能家居中的應(yīng)用
?
  在智能家居門禁系統(tǒng)中門磁開(kāi)關(guān)的作用是負(fù)責(zé)門磁通電否,通電帶磁(閉門),斷電消磁(開(kāi)門),門磁安裝于門與門套上,開(kāi)關(guān)安裝于屋內(nèi),配合自動(dòng)閉門器使用,一般可承受150公斤的拉力。
?
  有線門磁為嵌入式安裝更加隱蔽,感應(yīng)門窗的開(kāi)合,適用于木質(zhì)或鋁合金門窗發(fā)出有線常閉/常開(kāi)開(kāi)關(guān)信號(hào)。門磁是用來(lái)探測(cè)門、窗、抽屜等是否被非法打開(kāi)或移動(dòng)。它由無(wú)線發(fā)射器和磁塊兩部分組成。門磁系統(tǒng)其實(shí)和床磁等原理相同。

  Android系統(tǒng)提供了對(duì)傳感器的支持,如果手機(jī)的硬件提供了這些傳感器的話,那么我們就可以通過(guò)代碼獲取手機(jī)外部的狀態(tài)。比如說(shuō)手機(jī)的擺放狀態(tài)、外界的磁場(chǎng)、溫度和壓力等等。

  對(duì)于我們開(kāi)發(fā)者來(lái)說(shuō),開(kāi)發(fā)傳感器十分簡(jiǎn)單。只需要注冊(cè)監(jiān)聽(tīng)器,接收回調(diào)的數(shù)據(jù)就行了,下面來(lái)詳細(xì)介紹下各傳感器的開(kāi)發(fā)。

  使用

  第一步

  // 獲取傳感器管理對(duì)象

  SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);12

  第二步

  // 獲取傳感器的類型(TYPE_ACCELEROMETER:加速度傳感器)

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);12

  這里我們除了可以獲取加速度傳感器之外,還可以獲取其他類型的傳感器,如:

  * Sensor.TYPE_ORIENTATION:方向傳感器。

  * Sensor.TYPE_GYROSCOPE:陀螺儀傳感器。

  * Sensor.TYPE_MAGNETIC_FIELD:磁場(chǎng)傳感器。

  * Sensor.TYPE_GRAVITY:重力傳感器。

  * Sensor.TYPE_LINEAR_ACCELERATION:線性加速度傳感器。

  * Sensor.TYPE_AMBIENT_TEMPERATURE:溫度傳感器。

  * Sensor.TYPE_LIGHT:光傳感器。

  * Sensor.TYPE_PRESSURE:壓力傳感器

  第三步

  在onResume()方法中監(jiān)聽(tīng)傳感器傳回的數(shù)據(jù):

  @Override

  protected void onResume() {

  super.onResume();

  // 為加速度傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(new SensorEventListener() {

  // 當(dāng)傳感器的值改變的時(shí)候回調(diào)該方法

  @Override

  public void onSensorChanged(SensorEvent event) {

  }

  // 當(dāng)傳感器精度發(fā)生改變時(shí)回調(diào)該方法

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }

  }, mSensor, SensorManager.SENSOR_DELAY_GAME);

  }1234567891011121314151617

  其中,registerListener(SensorEventListener listener, Sensor sensor,int samplingPeriodUs)的三個(gè)參數(shù)說(shuō)明如下:

  listener:監(jiān)聽(tīng)傳感器時(shí)間的監(jiān)聽(tīng)器,該監(jiān)聽(tīng)器需要實(shí)現(xiàn)SensorEventListener接口

  sensor:傳感器對(duì)象。

  samplingPeriodUs:指定獲取傳感器頻率,一共有如下幾種:

  * SensorManager.SENSOR_DELAY_FASTEST:最快,延遲最小,同時(shí)也最消耗資源,一般只有特別依賴傳感器的應(yīng)用使用該頻率,否則不推薦。

  * SensorManager.SENSOR_DELAY_GAME:適合游戲的頻率,一般有實(shí)時(shí)性要求的應(yīng)用適合使用這種頻率。

  * SensorManager.SENSOR_DELAY_NORMAL:正常頻率,一般對(duì)實(shí)時(shí)性要求不高的應(yīng)用適合使用這種頻率。

  * SensorManager.SENSOR_DELAY_UI:適合普通應(yīng)用的頻率,這種模式比較省電,而且系統(tǒng)開(kāi)銷小,但延遲大,因此只適合普通小程序使用。

  并在onStop()方法中取消注冊(cè):

  @Override

  protected void onStop() {

  super.onStop();

  // 取消監(jiān)聽(tīng)

  mSensorManager.unregisterListener(this);

  }123456

  簡(jiǎn)單3步,就完成了監(jiān)聽(tīng)加速度傳感器的開(kāi)發(fā),是不是so easy?

  下面一個(gè)列子,演示了完整的監(jiān)聽(tīng)加速度傳感器的開(kāi)發(fā),并將結(jié)果顯示到屏幕上:

  public class MainActivity extends AppCompatActivity implements SensorEventListener{

  private SensorManager mSensorManager;

  private TextView mTxtValue;

  private Sensor mSensor;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  mTxtValue = (TextView) findViewById(R.id.txt_value);

  // 獲取傳感器管理對(duì)象

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  // 獲取傳感器的類型(TYPE_ACCELEROMETER:加速度傳感器)

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  }

  @Override

  protected void onResume() {

  super.onResume();

  // 為加速度傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);

  }

  @Override

  protected void onStop() {

  super.onStop();

  // 取消監(jiān)聽(tīng)

  mSensorManager.unregisterListener(this);

  }

  // 當(dāng)傳感器的值改變的時(shí)候回調(diào)該方法

  @Override

  public void onSensorChanged(SensorEvent event) {

  float[] values = event.values;

  StringBuilder sb = new StringBuilder();

  sb.append(“X方向的加速度:”);

  sb.append(values[0]);

  sb.append(“\nY方向的加速度:”);

  sb.append(values[1]);

  sb.append(“\nZ方向的加速度:”);

  sb.append(values[2]);

  mTxtValue.setText(sb.toString());

  }

  // 當(dāng)傳感器精度發(fā)生改變時(shí)回調(diào)該方法

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }

  }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

  運(yùn)行結(jié)果:

  方向傳感器

  方向傳感器用于感應(yīng)手機(jī)的擺放位置,它給我們返回了三個(gè)角度,這三個(gè)角度可以確定手機(jī)的擺放狀態(tài)。

  * 第一個(gè)角度:表示手機(jī)頂部朝向與正北方的夾角。當(dāng)手機(jī)繞著Z軸旋轉(zhuǎn)時(shí),該角度值發(fā)生改變。比如,當(dāng)該角度為0度時(shí),表明手機(jī)頂部朝向正北;該角度為90度時(shí),表明手機(jī)頂部朝向正東;該角度為180度時(shí),表明手機(jī)朝向正南;該角度為270度時(shí),表明手機(jī)頂部朝向正西。

  * 第二個(gè)角度:表示手機(jī)頂部或尾部翹起的高度。當(dāng)手機(jī)繞著X軸傾斜時(shí),該角度值發(fā)生變化,該角度的取值范圍是-180~180度。假設(shè)手機(jī)屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度值應(yīng)該是0度。假如從手機(jī)頂部開(kāi)始抬起,直到將手機(jī)沿X軸旋轉(zhuǎn)180度(屏幕向下水平放在桌子上),在這個(gè)旋轉(zhuǎn)的過(guò)程中,該角度值會(huì)從0度變化到-180度。也就是說(shuō),從手機(jī)頂部抬起時(shí),該角度的值會(huì)逐漸減少,直到等于-180度;如果從手機(jī)底部開(kāi)始抬起,直到將手機(jī)沿X軸旋轉(zhuǎn)180度(屏幕向下水平放在桌子上),該角度的值會(huì)從0度變化到180度,也就是說(shuō),從手機(jī)底部抬起時(shí),該角度的值會(huì)逐漸增大,直到等于180度。

  * 第三個(gè)角度:表示手機(jī)左側(cè)或右側(cè)翹起的角度。當(dāng)手機(jī)繞著Y軸傾斜時(shí),該角度值發(fā)生改變。該角度的取值范圍是:-90~90度。假設(shè)將手機(jī)屏幕朝上水平放在桌面上,如果桌面是完全水平的,該角度應(yīng)該為0度。如果將手機(jī)從左側(cè)開(kāi)始慢慢抬起,知道將手機(jī)沿著Y軸旋轉(zhuǎn)90度(手機(jī)與桌面垂直),在這個(gè)旋轉(zhuǎn)的過(guò)程中,該角度值會(huì)從0度變化到-90度。也就是說(shuō),從手機(jī)左側(cè)開(kāi)始抬起時(shí),該角度的值會(huì)逐漸的減少,知道等于-90度。如果從手機(jī)的右側(cè)抬起,則剛好相反,會(huì)從0度變化,直到90度。

  通過(guò)在應(yīng)用程序中使用方向傳感器,可以實(shí)現(xiàn)如:地圖導(dǎo)航、水平儀、指南針等應(yīng)用。

  陀螺儀傳感器

  陀螺儀傳感器用于感應(yīng)手機(jī)的旋轉(zhuǎn)速度。陀螺儀傳感器給我們返回了當(dāng)前設(shè)備的X、Y、Z三個(gè)坐標(biāo)軸(坐標(biāo)系統(tǒng)與加速度傳感器一模一樣)的旋轉(zhuǎn)速度。旋轉(zhuǎn)速度的單位是弧度/秒,旋轉(zhuǎn)速度為:

  正值代表逆時(shí)針旋轉(zhuǎn),負(fù)值代表順時(shí)針旋轉(zhuǎn)。關(guān)于返回的三個(gè)角速度說(shuō)明如下:

  * 第一個(gè)值:代表該設(shè)備繞X軸旋轉(zhuǎn)的角速度。

  * 第二個(gè)值:代表該設(shè)備繞Y軸旋轉(zhuǎn)的角速度。

  * 第三個(gè)值:代表該設(shè)備繞Z軸旋轉(zhuǎn)的角速度。

  磁場(chǎng)傳感器

  磁場(chǎng)感應(yīng)器主要讀取設(shè)備周圍的磁場(chǎng)強(qiáng)度。即便是設(shè)備周圍沒(méi)有任何直接的磁場(chǎng),設(shè)備也會(huì)始終處于地球的磁場(chǎng)中,除非你不在地球。。隨著手機(jī)設(shè)備擺放狀態(tài)的改變,周圍磁場(chǎng)在手機(jī)的X、Y、Z方向上的影響也會(huì)發(fā)生改變。磁場(chǎng)傳感器會(huì)返回三個(gè)數(shù)據(jù),分別代表周圍磁場(chǎng)分解到X、Y、Z三個(gè)方向的磁場(chǎng)分量,磁場(chǎng)數(shù)據(jù)的單位是微特斯拉。

  重力傳感器

  重力傳感器會(huì)返回一個(gè)三維向量,這個(gè)三維向量可顯示重力的方向和強(qiáng)度。重力傳感器的坐標(biāo)系統(tǒng)和加速度傳感器的坐標(biāo)系統(tǒng)相同。

  線性加速度傳感器

  線性加速度傳感器返回一個(gè)三維向量顯示設(shè)備在各個(gè)方向的加速度(不包含重力加速度)。線性加速度傳感器的坐標(biāo)系統(tǒng)和加速度傳感器的坐標(biāo)系統(tǒng)相同。

  線性加速度傳感器、重力傳感器、加速度傳感器,這三者輸出值的關(guān)系如下:

  加速度傳感器 = 重力傳感器 + 線性加速度傳感器。

  溫度傳感器

  溫度傳感器用于獲取設(shè)備所處環(huán)境的溫度。溫度傳感器會(huì)返回一個(gè)數(shù)據(jù),代表手機(jī)設(shè)備周圍的溫度,單位是攝氏度。

  光傳感器

  光傳感器用于獲取設(shè)備周圍光的強(qiáng)度。光傳感器會(huì)返回一個(gè)數(shù)據(jù),代表手機(jī)周圍光的強(qiáng)度,單位是勒克斯。

  壓力傳感器

  壓力傳感器用于獲取設(shè)備周圍壓力的大小。壓力傳感器會(huì)返回一個(gè)數(shù)據(jù),代表設(shè)備周圍壓力的大小。

  心率傳感器

  心率傳感器是在5.0之后新增的一個(gè)傳感器,用于返回佩戴設(shè)備的人每分鐘的心跳次數(shù)。該傳感器返回的數(shù)據(jù)準(zhǔn)確性可以通過(guò)SensorEvent的accuracy進(jìn)行判斷,如果該屬性值為:SENSOR_STATUS_UNRELIABLE或SENSOR_STATUS_NO_CONTACT,則表明傳感器返回的數(shù)據(jù)是不太可靠的,應(yīng)該丟棄。

  在使用心率傳感器時(shí),需要增加如下權(quán)限:

  《uses-permission android:name=“android.permission.BODY_SENSORS”/》1

  實(shí)例(獲取各傳感器數(shù)據(jù)并展示)

  public class MainActivity extends AppCompatActivity implements SensorEventListener{

  private SensorManager mSensorManager;

  private TextView mTxtValue1;

  private TextView mTxtValue2;

  private TextView mTxtValue3;

  private TextView mTxtValue4;

  private TextView mTxtValue5;

  private TextView mTxtValue6;

  private TextView mTxtValue7;

  private TextView mTxtValue8;

  private TextView mTxtValue9;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  mTxtValue1 = (TextView) findViewById(R.id.txt_value1);

  mTxtValue2 = (TextView) findViewById(R.id.txt_value2);

  mTxtValue3 = (TextView) findViewById(R.id.txt_value3);

  mTxtValue4 = (TextView) findViewById(R.id.txt_value4);

  mTxtValue5 = (TextView) findViewById(R.id.txt_value5);

  mTxtValue6 = (TextView) findViewById(R.id.txt_value6);

  mTxtValue7 = (TextView) findViewById(R.id.txt_value7);

  mTxtValue8 = (TextView) findViewById(R.id.txt_value8);

  mTxtValue9 = (TextView) findViewById(R.id.txt_value9);

  // 獲取傳感器管理對(duì)象

  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  }

  @Override

  protected void onResume() {

  super.onResume();

  // 為加速度傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);

  // 為方向傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME);

  // 為陀螺儀傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME);

  // 為磁場(chǎng)傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME);

  // 為重力傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_GAME);

  // 為線性加速度傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_GAME);

  // 為溫度傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE), SensorManager.SENSOR_DELAY_GAME);

  // 為光傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_GAME);

  // 為壓力傳感器注冊(cè)監(jiān)聽(tīng)器

  mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_GAME);

  }

  @Override

  protected void onStop() {

  super.onStop();

  // 取消監(jiān)聽(tīng)

  mSensorManager.unregisterListener(this);

  }

  // 當(dāng)傳感器的值改變的時(shí)候回調(diào)該方法

  @Override

  public void onSensorChanged(SensorEvent event) {

  float[] values = event.values;

  // 獲取傳感器類型

  int type = event.sensor.getType();

  StringBuilder sb;

  switch (type){

  case Sensor.TYPE_ACCELEROMETER:

  sb = new StringBuilder();

  sb.append(“加速度傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\nX方向的加速度:”);

  sb.append(values[0]);

  sb.append(“\nY方向的加速度:”);

  sb.append(values[1]);

  sb.append(“\nZ方向的加速度:”);

  sb.append(values[2]);

  mTxtValue1.setText(sb.toString());

  break;

  case Sensor.TYPE_ORIENTATION:

  sb = new StringBuilder();

  sb.append(“\n方向傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\n繞Z軸轉(zhuǎn)過(guò)的角度:”);

  sb.append(values[0]);

  sb.append(“\n繞X軸轉(zhuǎn)過(guò)的角度:”);

  sb.append(values[1]);

  sb.append(“\n繞Y軸轉(zhuǎn)過(guò)的角度:”);

  sb.append(values[2]);

  mTxtValue2.setText(sb.toString());

  break;

  case Sensor.TYPE_GYROSCOPE:

  sb = new StringBuilder();

  sb.append(“\n陀螺儀傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\n繞X軸旋轉(zhuǎn)的角速度:”);

  sb.append(values[0]);

  sb.append(“\n繞Y軸旋轉(zhuǎn)的角速度:”);

  sb.append(values[1]);

  sb.append(“\n繞Z軸旋轉(zhuǎn)的角速度:”);

  sb.append(values[2]);

  mTxtValue3.setText(sb.toString());

  break;

  case Sensor.TYPE_MAGNETIC_FIELD:

  sb = new StringBuilder();

  sb.append(“\n磁場(chǎng)傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\nX軸方向上的磁場(chǎng)強(qiáng)度:”);

  sb.append(values[0]);

  sb.append(“\nY軸方向上的磁場(chǎng)強(qiáng)度:”);

  sb.append(values[1]);

  sb.append(“\nZ軸方向上的磁場(chǎng)強(qiáng)度:”);

  sb.append(values[2]);

  mTxtValue4.setText(sb.toString());

  break;

  case Sensor.TYPE_GRAVITY:

  sb = new StringBuilder();

  sb.append(“\n重力傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\nX軸方向上的重力:”);

  sb.append(values[0]);

  sb.append(“\nY軸方向上的重力:”);

  sb.append(values[1]);

  sb.append(“\nZ軸方向上的重力:”);

  sb.append(values[2]);

  mTxtValue5.setText(sb.toString());

  break;

  case Sensor.TYPE_LINEAR_ACCELERATION:

  sb = new StringBuilder();

  sb.append(“\n線性加速度傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\nX軸方向上的線性加速度:”);

  sb.append(values[0]);

  sb.append(“\nY軸方向上的線性加速度:”);

  sb.append(values[1]);

  sb.append(“\nZ軸方向上的線性加速度:”);

  sb.append(values[2]);

  mTxtValue6.setText(sb.toString());

  break;

  case Sensor.TYPE_AMBIENT_TEMPERATURE:

  sb = new StringBuilder();

  sb.append(“\n溫度傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\n當(dāng)前溫度為:”);

  sb.append(values[0]);

  mTxtValue7.setText(sb.toString());

  break;

  case Sensor.TYPE_LIGHT:

  sb = new StringBuilder();

  sb.append(“\n光傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\n當(dāng)前光的強(qiáng)度為:”);

  sb.append(values[0]);

  mTxtValue8.setText(sb.toString());

  break;

  case Sensor.TYPE_PRESSURE:

  sb = new StringBuilder();

  sb.append(“\n壓力傳感器返回?cái)?shù)據(jù):”);

  sb.append(“\n當(dāng)前壓力為:”);

  sb.append(values[0]);

  mTxtValue9.setText(sb.toString());

  break;

  }

  }

  // 當(dāng)傳感器精度發(fā)生改變時(shí)回調(diào)該方法

  @Override

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }

  }


非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

( 發(fā)表人:金巧 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?