Android--Sensor感應器

來源:互聯網
上載者:User

標籤:android   style   blog   class   code   java   

前言

  Android提供了對裝置感應器的支援,只要Android裝置的硬體提供了這些感應器,Android應用可以通過感應器來擷取裝置的外界條件,包括手機的運行狀態、當前擺放的方向等。Android系統還提供了驅動程式去管理這些感應器硬體,可以通過監聽器的方式監聽感應器硬體感知到的外部環境的變化。本篇部落客要講解如何簡單的使用Android下的感應器,最後將以一個簡單的Demo示範。

 

開發感應器應用步驟

  開發一個對於感應器支援的應用十分簡單,開發人員只要在感應器管理器SensorManager中為所要監聽的感應器指定一個監聽器即可,當外部環境發生變化的時候,Android系統會通過感應器擷取外部環境的資料,然後將資料傳遞給監聽器的監聽回調方法。具體步驟如下:

  1. 擷取感應器服務。
  2. 從感應器服務中擷取到指定類型的感應器。
  3. 使用感應器服務添加感應器的監聽器。
  4. 在使用完之後,登出感應器的監聽器。

  

擷取感應器服務

  Android中內建了很多系統級的服務,用於給開發人員使用,而感應器也是通過感應器服務,SensorManager來管理的。而在Android組件中擷取系統服務,使用方法Context.getSystemService(String)即可,它的參數均以static final的方式定義在Context中,而擷取SensorManager需要傳入Context.SENSOR_SERVICE。

1         manager=(SensorManager) getSystemService(SENSOR_SERVICE);

 

從感應器服務中擷取到指定類型的感應器

  感應器服務管理裝置上所有的感應器,所以需要指定待監聽的感應器。擷取待監聽的感應器,需要使用SensorManager.getDefaultSensor()方法,它的完整簽名如下:

    Sensor getDefaultSensor(int type)

  Android中的感應器需要Sensor支援,getDefaultSensor()方法通過指定的type參數擷取到相對應的感應器。type參數被以static final的方式定義在Sensor內部,方便開發人員可以直接使用。下面介紹幾個常用感應器的type:

  • Sensor.TYPE_ORIENTATION:方向感應器。
  • Sensor.TYPE_ACCELEROMETER:重力感應器。
  • Sensor.TYPE_LIGHT:光線感應器。
  • Sensor.TYPE_MAGNETIC_FIELD:磁場感應器。

 

使用感應器服務添加感應器的監聽器

  獲得SensorManager和Sensor對象之後,就可以為其Sensor註冊監聽器了。為感應器註冊監聽器,使用SensorManager.registerListener()方法即可,它存在多個重載方法,但是有些方法已經過時了,下面提供一個常用的方法的簽名:

    boolean registerListener(SensorEventListener listener,Sensor sensor,int rateUs)

  上面方法參數的意義:listener:感應器的監聽器、sensor:待監聽的感應器、rateUs:感應器的採樣率。

  從registerListener()方法可以看出,它需要傳遞一個SensorEventListener對象,它就是感應器的監聽器,其中包含兩個方法,需要開發人員去實現它:

  • void onAccuracyChanged(Sensor sensor,int accuracy):當感應器精度發生變化時回調。
  • void onSensorChanged(SensorEvent event):當感應器感應的值發生變化時回調。

  對於上面兩個方法,感應器的精度一般是不會發生改變的,所以我們一般主要的代碼量在onSensorChanged()中。

 

  registerListener()方法還有一個rateUs的參數,它表示監聽感應器改變的採樣率,就是從感應器擷取值的頻率。它被定義以static final的形式定義在SensorManager中,方便我們直接使用,它定義了如下幾個選項:

  • SensorManager.SENSOR_DELAY_FASTEST:最快,延遲最小。
  • SensorManager.SENSOR_DELAY_GAME:適合遊戲的頻率。
  • SensorManager.SENSOR_DELAY_NORMAL:正常頻率。
  • SensorManager.SENSOR_DELAY_UI:適合普通使用者介面UI變化的頻率。

  Android為我們提供了這幾個採樣率的參數,方便我們使用。但對於選擇那種採樣率而言,並不是越快越好,要參照實際開發的應用的情況來說,採樣率越大,將越耗費資源,包括電量、CPU等,所以要根據實際情況選擇,畢竟再強大的應用,如果造成裝置續航能力的降低,也是會被使用者所不喜的。

 

在使用完之後,登出感應器的監聽器

  當使用完感應器之後,需要為其登出監聽器,因為感應器的監聽器並不會因為應用的結束而自行釋放資源,需要開發人員在適當的時候主動登出。登出感應器監聽器使用SensorManager.unregisterListener()方法即可,和監聽器的註冊方法一樣,它也具有多個重載的方法,但是有一些已經被棄用了,下面介紹一個常用的完整簽名:

    void unregisterListener(SensorEventListener listener)

 

指南針Demo

  上面已經講解了在應用中使用感應器的步驟以及具體內容,下面通過一個簡單的Demo來示範一下如何使用感應器。在Demo中監聽方向感應器,使其角度的變化改變來操作方向,類比一個指南針的效果。

  重寫監聽器的onSensorChanged()方法,其中event擷取噹噹前監聽事件的參數,可以使用values[0]擷取到當前的方向感應器感應到的角度。參照官方文檔,可以看出,它代表一個360°的角度,規則是: 0=North, 90=East, 180=South, 270=West。

  下面直接貼代碼了,注釋比較全,就不再贅述了,會用到補間動畫的內容,對補間動畫不瞭解的朋友,可以看看另外一篇部落格:Android--Tween補間動畫。還有一點需要注意的是就是感應器的Demo需要在真機上測試,因為模擬器上不存在感應器硬體。

 1 package com.example.sensormanagerdemo; 2  3 import android.hardware.Sensor; 4 import android.hardware.SensorEvent; 5 import android.hardware.SensorEventListener; 6 import android.hardware.SensorManager; 7 import android.os.Bundle; 8 import android.view.animation.Animation; 9 import android.view.animation.RotateAnimation;10 import android.widget.ImageView;11 import android.app.Activity;12 13 public class MainActivity extends Activity {14     private ImageView iv_compass;15     private SensorManager manager;16     private float startDegree = 0f;17 18     @Override19     protected void onCreate(Bundle savedInstanceState) {20         super.onCreate(savedInstanceState);21         setContentView(R.layout.activity_main);22 23         iv_compass = (ImageView) findViewById(R.id.iv_compass);24         // 獲得感應器管理器25         manager = (SensorManager) getSystemService(SENSOR_SERVICE);26 27     }28 29     @Override30     protected void onResume() {31         super.onResume();32         // 為方向感應器註冊監聽器33         manager.registerListener(listener,34                 manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),35                 SensorManager.SENSOR_DELAY_UI);36 37     }38 39     private SensorEventListener listener = new SensorEventListener() {40 41         @Override42         public void onSensorChanged(SensorEvent event) {43             if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {44                 // 擷取當前感應器擷取到的角度45                 float degree = -event.values[0];46                 // 通過補間動畫旋轉角度 從上次的角度旋轉47                 RotateAnimation ra = new RotateAnimation(startDegree, degree,48                         Animation.RELATIVE_TO_SELF, 0.5f,49                         Animation.RELATIVE_TO_SELF, 0.5f);50                 ra.setDuration(200);51                 iv_compass.startAnimation(ra);52                 // 記錄當前旋轉後的角度53                 startDegree = degree;54             }55         }56 57         @Override58         public void onAccuracyChanged(Sensor sensor, int accuracy) {59 60         }61     };62 63     @Override64     protected void onStop() {65         // 為感應器登出監聽器66         manager.unregisterListener(listener);67         super.onStop();68     }69 }

  效果展示:

 

  源碼下載

 

總結

  本篇部落格講解了Android下如何使用感應器,只是簡單的介紹了一下,對於感應器擷取到的數值,都在event.values數組中,但是不同感應器擷取到的值不同,具體情況具體分析,這裡就不再深入討論了。 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.