此次課程介紹一下手機上常用的一些感測器,基本上由於手機主晶片常常內建GNSS(例如美國的GPS+俄羅斯的GLONASS+中國的BDS三大系統)所以哩~~~GNSS與其它手機感測器有些不同,是類似但不同的開發方式,因此GNSS下週教,廢話不多說開始吧
現今大部分的android手機都內建有感測器(sensor)。感測器(sensor)的功用有測量動作、方向和環境狀況等等,以下將感測器分為三大類。
感測器 (sensor) 種類:
(1) 動作感測器(Motion sensors) 三方向加速和旋轉的測量。 其中包含加速規(accelerometers)、重力感測器(gravity sensors)、陀螺儀(gyroscopes)和旋轉向量感測器(rotation vector sensors)。
(2) 環境感測器(Environmental sensors) 溫度、氣壓、光照的測量。 其中包含氣壓計(barometer)、光度計(photometers)和溫度計(thermometer)
(3) 位置感測器(Position sensors) 物理位置的測量。 其中包括方向感測器(orientation sensors)、磁力計(magnetometers)
感測器框架(Sensor Format):可以利用以下類別(class)或介面(interface)取得感測器的服務與資料 (Q1. 類別跟介面有啥差別呀??? 搶答時間 先答對的平常成績總分加一分)
(1) SensorManager:取得感測器的服務
(2) Sensor:取得可以用感測器種類的清單
(3) SensorEvent:取得感測器的資料(data)
(4) SensorEventListener:當感測器有所改變時告知
下圖是Sensor程式的基本架構,取自於Android Developers
JAVA與C++有幾個重要的差異,其中之一就是JAVA不支援多重繼承,因為C++為了多重繼承搞了一堆機制有些複雜(如虛擬繼承 ...),所以JAVA只能單一繼承一個類別(class)但可以實現多個介面(interface),上面程式碼中第一行就是啦,extends 後面跟著的是父類別,implements後面跟著的是interface,多於一個interface要實現時,interface間用逗號分開即可。而extends與implements間那個逗號也可以不要。
此次範例將練習加速規(accelerometers)、陀螺儀(gyroscopes)和磁力計(magnetometers)。取出此三種感測器的資料並放到TextView顯示。此三種感測器都各有x、y和z三方向。三方向如下圖所示,圖片取自於Android Developers。
來實作吧~~~
Step.1 開設新專案,專案名稱設為:CH3_學號
Step 2 :新增TextView
(1) 在Layout中新增六個TextView (activity_main.xml) : 請同學隨意拉六個TextView到畫面中並更改各個TextView元件的text與id。
(2) Code 可參考下圖更改,每個元件的 id 要不一樣喔。此部分於導航實習第二章有詳細介紹。
(2) 在主程式中取得TextView元件 (MainActivity.java):
● 此部分於導航實習第二章有詳細介紹
※ 另外要記得 import android.widget.TextView。
Step 3 :完成Sensor基本架構
(1) implements SensorEventListener 如下圖所示,要先 implements SensorEventListener 。 implements 是實作的意思,可以實作介面(interface)。
(2) 還要加上onAccuracyChanged (精度改變時呼叫) 和 onSensorChanged (data改變時呼叫) 兩個方法才是算完成。
※ 別忘了要 import android.hardware.SensorEventListener 、 import android.hardware.Sensor 和 import android.hardware.SensorEvent。
(3) SensorManager and Sensor 宣告 SensorManager 和 Sensor 物件。SensorManager提供你所需要的感測器服務。
(4) 另外還要加上onPause(app暫停時會呼叫)和onResume(app再度打開時會呼叫)這兩個方法。在onPause方法裡關閉感測器監聽事件,在onResume方法裡打開監聽事件。這個很重要,因為不需要無時無刻都打開用不到的感測器,要不然會造成電池耗電量的增加。
● onResume 打開監聽事件
● onPause 關閉感測器監聽事件
※ 一樣要記得 import android.hardware.SensorManager 。
Step 4 :顯示於TextView
結果如下:
加速規單位:
陀螺儀單位:
磁力計單位:
完整程式碼如下圖:
這字也太小了吧 打完收工
大圖分流: https://imgur.com/a/Hy3VxS1
實作(二)
利用加速感測器製作水平儀
範例影片 :
https://photos.app.goo.gl/nqa7DguXBntNprM43
簡單來說,我們要把之前的實作結果,作為一個日常小小的應用,利用各個加速規的值來檢測手機,檢測是否平衡
step 1 :
請新增專案, 並將程式名稱設為 " [ 學號 ]_Ez水平儀"。
step 2:
除了TextVIew 用來顯示加速規的數值,再多放ImageView作為水平儀圖標
注意布局檔設置RelativeLayout 以及每個ID的設置,還有作為中央參考點 igvFix 的布局位置
step 2:
首先在MainActivity implements SensorEventLixtener 以及宣告全域變數
再來和上次實作大致相同,由系統服務取得感測器管理員、取得加速規感測器、透過ID連結布局檔元件(TextView、ImageView、RelativeLayout)
除了這些外 我們還需要 鎖定我們的螢幕,手機旋轉時不會改變螢幕轉向,
同樣注意 另外還要加上onPause(app暫停時會呼叫)和onResume(app再度打開時會呼叫)這兩個方法
接著就是重頭戲囉,我們除了要隨時顯示加速規感測得的數值之外,還要讓我們宣告的小圖示隨著手機擺動改變位置
再補上加速規數值的顯示
這個機制大概是
MainActivity.java 完整程式碼
無碼高清圖分流支援
https://imgur.com/a/AiXd3