搜尋此網誌

2021年8月19日 星期四

Android 的 Sensor

 緣起:


    繼上次 Android 與 Unity 的結合成功後,我又開始在想我們的專題會需要用到什麼,後來想到的是,應該會需要使用到 android 手機上的加速度感應器之類的東東,用來偵測手機的轉動,再將這些轉動反應在 VR 世界的鏡頭上,所以最近就開始研究起這些感測器如何使用。

    Android 官方對於 Sensor 的說明很詳盡與易懂,我就直接讀他們對於 Sensor 的簡介,學到不少東西,想說把用法記到這篇文章上,方便之後有需要再查看。




Sensor 與 SensorManager:


    Android 裡的各類感測器,統一都用 Sensor 類別來操作與存取,而 SensorManager 可以幫我們得到.... Sensor 的服務 (? ,反正就是一個很重要的類別,一定要用它來存取 Sensor 的服務,然後這兩個類別都是在 andorid.hardware 下。

    可以用 (SensorManager) getSystemService(Context.SENSOR_SERVICE) 來取得 SensorManager,然後 SensorManager 有個 getSensorList() 方法,會回傳 Sensor 的串列,那個 getSensorList 方法,可以傳入 Sensor 類別的各類 TYPE 參數來取得想要的感測器種類。

有十幾種以上的感測器種類 (官方文件上的表格)

例子

    同種類別的感測器在同一台手機上可能有多個,我們可以用 SensorManager 的 getDefaultSensor 方法來取得預設的感測器 (方法裡一樣傳入 Sensor 的 TYPE 參數),如果找不到的話,那個方法就會回傳 null。

    Sensor 的部份,有 getName 方法來得到 Sensor 的名字、getVendor 來得到銷售商、getVersion 來得到版本。getMinDelay 能得到感測器每次讀取資料的最小間格 (單位為百萬分之一秒),如果得到的數值是 0 的話,表示這感測器不是... 持續感測的 (? 。


SensorEvents:

    
    這邊應該是最重要的部份,就是得到感測器的數值,是用監聽的方式,要 implements SensorEventListener,實作 onAccurayChanged 與 onSensorChanged。官方文件有提供一個很詳細的範例,我直接抄它的模式,然後寫了個自己的測試程式。

    我的程式要測試的是加速度感測器,感測器會回傳 x y z 軸的加速度值,所以我用了三個 TextView 來顯示那三個變化的數值。


    然後程式的部份,首先,要有個東西 implements SensorEventListener,這裡是由 Activity 來 implements,接著在 Activity 裡寫好 onAccurayChanged 與 onSensorChanged 方法。

其實我沒特別去理解這東西在幹啥,現階段似乎用不到。


    onSensorChanged 會傳入一個 SensorEvent 物件,可以透過它的 values 陣列來取得感測器的值,因為有三個值,因此陣列的索引最大會到 2 。那個 texts 是存著 TextView 的陣列,會依序變換成 x y z 軸的加速度值。

    最後是向 SensorManager 註冊與取消監聽事件部份
    

    在 Activity 的 onResume 週期裡註冊,使用 SensorManager 的 registerListener 方法,第一個參數是 implements SensorEventsListener 的物件,第二個是 Sensor 類別,然後第三個參數可以決定取樣的頻率。

    在 Activity 的 onPause 週期裡取消監聽,可以在程式閒置的時候減少不必要的耗能,只要呼叫 SensorManager 的 unregisterListener 方法,傳入已被註冊、implements SensorEventsListener 的物件。

成功 !!

    順帶紀錄,手機上的加速度感測器,它的 x y z 軸在手機上是長這樣的

沒有留言:

張貼留言