Android提供了對設備傳感器的支持,只要Android設備的硬件提供了這些傳感器,Android應用可以通過傳感器 來獲取設備的外界條件,包括手機的運行狀態、當前擺放的方向等。Android系統還提供了驅動程序去管理這些傳感器硬件,可以通過監聽器的方式監聽傳感 器硬件感知到的外部環境的變化。本篇博客主要講解如何簡單的使用Android下的傳感器,最后將以一個簡單的Demo演示。
開發傳感器應用步驟
開發一個對於傳感器支持的應用十分簡單,開發人員只要在傳感器管理器SensorManager中為所要監聽的傳感器指定一個監聽器即可,當外部環境發 生變化的時候,Android系統會通過傳感器獲取外部環境的數據,然后將數據傳遞給監聽器的監聽回調方法。具體步驟如下:
- 獲取傳感器服務。
- 從傳感器服務中獲取到指定類型的傳感器。
- 使用傳感器服務添加傳感器的監聽器。
- 在使用完之后,注銷傳感器的監聽器。
獲取傳感器服務
Android中內置了很多系統級的服務,用於給開發人員使用,而傳感器也是通過傳感器服務,SensorManager來管理的。而在Android 組件中獲取系統服務,使用方法Context.getSystemService(String)即可,它的參數均以static final的方式定義在Context中,而獲取SensorManager需要傳入Context.SENSOR_SERVICE。
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)
