此次課程介紹一下手機上常用的一些感測器,基本上由於手機主晶片常常內建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

未命名02.png

 

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改變時呼叫) 兩個方法才是算完成。

image

※ 別忘了要 import android.hardware.SensorEventListenerimport 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再度打開時會呼叫)這兩個方法

123.png


接著就是重頭戲囉,我們除了要隨時顯示加速規感測得的數值之外,還要讓我們宣告的小圖示隨著手機擺動改變位置

 

再補上加速規數值的顯示

這個機制大概是

MainActivity.java 完整程式碼

 

123.png

無碼高清圖分流支援

https://imgur.com/a/AiXd3

 

 

arrow
arrow
    文章標籤
    課程講義 Android Studio
    全站熱搜
    創作者介紹
    創作者 ntougpslab 的頭像
    ntougpslab

    精密導航實驗室的部落格

    ntougpslab 發表在 痞客邦 留言(0) 人氣()