第9章-傳感器訪問_第1頁
第9章-傳感器訪問_第2頁
第9章-傳感器訪問_第3頁
第9章-傳感器訪問_第4頁
第9章-傳感器訪問_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第九章傳感器訪問本章主要內(nèi)容傳感器API介紹傳感器相關(guān)的坐標(biāo)系獲取設(shè)備的傳感器種類指南針計步器傳感器API在Android應(yīng)用程序中使用傳感器要依賴于android.hardware.SensorEventListener接口。通過該接口可以監(jiān)聽傳感器的各種事件。SensorEventListener接口如下:packageandroid.hardware;publicinterfaceSensorEventListener{//傳感器采樣值發(fā)生變化時調(diào)用publicabstractvoidonSensorChanged(SensorEventevent); //傳感器精度發(fā)生改變時調(diào)用publicabstractvoidonAccuracyChanged(Sensorsensor,intaccuracy);}傳感器API接口包括了如上段代碼中所聲明的兩個方法,其中onAccuracyChanged方法在一般場合中比較少使用到,常用的是onSensorChanged方法,它只有一個SensorEvent類型的參數(shù)event,SensorEvent類代表了一次傳感器的響應(yīng)事件,當(dāng)系統(tǒng)從傳感器獲取到信息的變更時,會捕獲該信息并向上層返回一個SensorEvent類型的對象,這個對象包含了傳感器類型(publicSensorsensor)、傳感事件的時間戳(publiclongtimestamp)、傳感器數(shù)值的精度(publicintaccuracy)以及傳感器的具體數(shù)值(publicfinalfloat[]values)。values值非常重要,其數(shù)據(jù)類型是float[],它代表了從各種傳感器采集回的數(shù)值信息,該float型的數(shù)組最多包含3個成員,而根據(jù)傳感器的不同,values中個成員所代表的含義也不同。例如,通常溫度傳感器僅僅傳回一個用于表示溫度的數(shù)值,而加速度傳感器則需要傳回一個包含X、Y、Z三個軸上的加速度數(shù)值,同樣的一個數(shù)據(jù)“10”,如果是從溫度傳感器傳回則可能代表10攝氏度,而如果從亮度傳感器傳回則可能代表數(shù)值為10的亮度單位,如此等等。傳感器相關(guān)的坐標(biāo)系為了正確理解傳感器所傳回的數(shù)值,這里首先介紹Android所定義的兩個坐標(biāo)系,即世界坐標(biāo)系(worldcoordinate-system)和旋轉(zhuǎn)坐標(biāo)系(rotationcoordinate-system)。世界坐標(biāo)系這個坐標(biāo)系定義了從一個特定的Android設(shè)備上來看待外部世界的方式,主要是以設(shè)備的屏幕為基準(zhǔn)而定義,并且該坐標(biāo)系依賴的是屏幕的默認(rèn)方向,不隨屏幕顯示的方向改變而改變。世界坐標(biāo)系坐標(biāo)系以屏幕的中心為圓點,其中:X軸方向是沿著屏幕的水平方向從左向右。手機(jī)默認(rèn)的正放狀態(tài),一般來說即是如圖9-1所示的默認(rèn)為長邊在左右兩側(cè)并且聽筒在上方的情況,如果是特殊的設(shè)備,則可能X和Y軸會互換。Y軸方向與屏幕的側(cè)邊平行,是從屏幕的正中心開始沿著平行屏幕側(cè)邊的方向指向屏幕的頂端。Z軸將手機(jī)屏幕朝上平放在桌面上時,屏幕所朝的方向。旋轉(zhuǎn)坐標(biāo)系如圖,圖中球體可以理解為地球,這個坐標(biāo)系是專用于方位傳感器(OrientationSensor)的,可以理解為一個“反向的(inverted)”世界坐標(biāo)系,方位傳感器即用于描述設(shè)備所朝向的方向的傳感器,而Android為描述這個方向而定義了一個坐標(biāo)系,這個坐標(biāo)系也由X、Y、Z軸構(gòu)成,特別之處是方向傳感器所傳回的數(shù)值是屏幕從標(biāo)準(zhǔn)位置(屏幕水平朝上且正北)開始分別以這三個坐標(biāo)軸為軸所旋轉(zhuǎn)的角度。使用方位傳感器的典型用例即“電子羅盤”。旋轉(zhuǎn)坐標(biāo)系在旋轉(zhuǎn)坐標(biāo)系中:X軸即Y軸與Z軸的向量積Y?Z,方位是與地球球面相切并且指向地理的西方。Y軸為設(shè)備當(dāng)前所在位置與地面相切并且指向地磁北極的方向。Z軸為設(shè)備所在位置指向地心的方向,垂直于地面。旋轉(zhuǎn)坐標(biāo)系方位傳感器與旋轉(zhuǎn)坐標(biāo)系當(dāng)方向傳感器感應(yīng)到方位變化時會返回一個包含變化結(jié)果數(shù)值的數(shù)組,即values[],數(shù)組的長度為3,它們分別代表:values[0]——方位角,即手機(jī)繞Z軸所旋轉(zhuǎn)的角度。values[1]——傾斜角,專指繞X軸所旋轉(zhuǎn)的角度。values[2]——翻滾角,專指繞Y軸所旋轉(zhuǎn)的角度。以上所指明的角度都是逆時針方向的。獲取設(shè)備上傳感器種類為了獲取當(dāng)前手機(jī)上已連接的傳感器清單,需要借助于SensorManager的getSensorList()方法,首先需要獲取一個SensorManager類的實例,方法如下:privateSensorManagermSensorManager;mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);在獲取了當(dāng)前系統(tǒng)的SensorManager類的對象后,就可以通過其getSensorList()方法來獲取相應(yīng)的傳感器清單了,方法如下:List<Sensor>sensors=mSensorManager.getSensorList(Sensor.TYPE_ALL);獲取了傳感器清單后,通過如下代碼將每個傳感器的名稱依次顯示到TextView上:sensorList=(TextView)findViewById(R.id.sensorlist);for(Sensorsensor:sensors){//輸出傳感器的名稱sensorList.append(sensor.getName()+"\n");}獲取的傳感器列表下面是通過前面代碼獲取到的一個傳感器列表:從結(jié)果中可以看出,該款真機(jī)支持了如下型號的共六種類型的傳感器:LIS331DLH3-axisAccelerometer——加速度傳感器;AK89733-axisMagneticfieldsensor——磁場傳感器;AK8973Temperaturesensor——溫度傳感器;SFH7743Proximitysensor——鄰近度傳感器;Orientationsensor——方位傳感器;LM3530Lightsensor——亮度傳感器。利用傳感器實現(xiàn)指南針功能功能實現(xiàn)分析在指南針應(yīng)用中,需要關(guān)注的是手機(jī)繞旋轉(zhuǎn)坐標(biāo)系Z軸所旋轉(zhuǎn)的角度,也就是傳感器所傳回的values[0]值,該values[0]的值即代表了手機(jī)當(dāng)前已經(jīng)繞Z軸所旋轉(zhuǎn)的角度,這個角度以正北方向為基準(zhǔn),其返回的值如下圖。假定圖中右方箭頭所指方向為正北,左方圓形中的箭頭所指的是手機(jī)(傳感器)所朝的方向,數(shù)值則是傳感器返回的values[0]值。利用傳感器實現(xiàn)指南針功能首先需要為Activity實現(xiàn)SensorEventListener接口,即在類中實現(xiàn)如下兩個方法:publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){}publicvoidonSensorChanged(SensorEventevent){}然后需要為當(dāng)前的Activity注冊需要使用的傳感器,通過如下的方式獲取到系統(tǒng)默認(rèn)的方位傳感器的實例:mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);mOrientation=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);利用傳感器實現(xiàn)指南針功能然后,需要完成傳感器事件監(jiān)聽器和傳感器的注冊工作,只有注冊了之后,傳感器管理器(SensorManager)才會將相應(yīng)的傳感信號傳給該監(jiān)聽器,通常將這個注冊的操作放在Activity的onResume()方法下,同時將取消注冊即注銷的操作放在Activity的onPause()方法下,這樣就可以使傳感器的資源得到合理的使用和釋放,方法如下:protectedvoidonResume(){super.onResume();mSensorManager.registerListener(this,mOrientation,SensorManager.SENSOR_DELAY_UI);}protectedvoidonPause(){super.onPause();mSensorManager.unregisterListener(this);}利用傳感器實現(xiàn)指南針功能指南針使用一個ImageView來實現(xiàn),而指南針的旋轉(zhuǎn)則使用了RotateAnimation類,這個類專用于定義旋轉(zhuǎn)圖像的操作,它的一個構(gòu)造方法如下:RotateAnimation(floatfromDegrees,floattoDegrees,intpivotXType,floatpivotXValue,intpivotYType,floatpivotYValue)構(gòu)造方法包含了六個參數(shù),它們的含義分別如下:fromDegrees:即該段旋轉(zhuǎn)動畫的起始度數(shù);toDegrees:旋轉(zhuǎn)的終點度數(shù);pivotXType:這個參數(shù)用于指定其后的pivotXValue的類型,即說明按何種規(guī)則來解析pivotXValue數(shù)值,目前包括三種類型即Animation.ABSOLUTE(絕對數(shù)值,即pivotXValue為坐標(biāo)值)、Animation.RELATIVE_TO_SELF(相對于自身的位置,如本示例中的ImageView,當(dāng)pivotXValue為0.5時表示旋轉(zhuǎn)的軸心X坐標(biāo)在圖形的X邊的中點)、Animation.RELATIVE_TO_PARENT(相對于父視圖的位置);pivotXValue:即動畫旋轉(zhuǎn)的軸心的值,對它的解析依賴于前面的pivotXType指定的類型;pivotYType:類似于pivotXType,只是這個參數(shù)代表的為Y軸;pivotYValue:類似于pivotXValue,只是這個參數(shù)代表的為Y軸。利用傳感器實現(xiàn)指南針功能下面來構(gòu)造本例中的RotateAnimation對象,如下:RotateAnimationra;ra=newRotateAnimation(currentDegree,targetDegree,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200); //在200毫秒之內(nèi)完成旋轉(zhuǎn)動作如上段代碼,第02~04行定義了該旋轉(zhuǎn)動畫的屬性,即以執(zhí)行該動畫的對象的正中心為旋轉(zhuǎn)軸進(jìn)行旋轉(zhuǎn),第05行則設(shè)定了完成整個旋轉(zhuǎn)動作這個過程的時間。有了這個ra對象,ImageView對象通過方法:ImageView.startAnimation(ra);利用傳感器實現(xiàn)指南針功能最后還需要找一張圖片用于指定各個方向,為了美觀和便于使用,示例使用了一張矩形圖片,如右圖,關(guān)于自身中心顯得對稱,并且該圖片中指示北極的箭頭是朝正上方的,即可以設(shè)定原始圖片的旋轉(zhuǎn)度數(shù)為0,如果原始圖片的北極不是指向正上方也可以使用,但是會為之后的編碼引入額外的工作量。準(zhǔn)備好了圖片資源,將其放入到工程的drawable目錄下,并在Activity的onCreate()方法中綁定。compass=(ImageView)findViewById(R.pass);利用傳感器實現(xiàn)指南針功能有了compass這個ImageView,就只需要在onSensorChanged()方法中通過傳感器傳回的數(shù)值來定義出需要執(zhí)行的RotateAnimationra,并執(zhí)行compass.startAnimation(ra)就可以實現(xiàn)在傳感器每次傳回數(shù)值時對指南針進(jìn)行轉(zhuǎn)動,從而實現(xiàn)了指南針的功能。onSensorChanged()的完整代碼如下:publicvoidonSensorChanged(SensorEventevent){switch(event.sensor.getType()){caseSensor.TYPE_ORIENTATION:{//處理傳感器傳回的數(shù)值并反映到圖像的旋轉(zhuǎn)上,//需要注意的是由于指南針圖像的旋轉(zhuǎn)是與手機(jī)(傳感器)相反的,//因此需要旋轉(zhuǎn)的角度為負(fù)的角度(-event.values[0])floattargetDegree=-event.values[0];rotateCompass(currentDegree,targetDegree);currentDegree=targetDegree;break;}default:break;}}//…后頁續(xù)利用傳感器實現(xiàn)指南針功能有了compass這個ImageView,就只需要在onSensorChanged()方法中通過傳感器傳回的數(shù)值來定義出需要執(zhí)行的RotateAnimationra,并執(zhí)行compass.startAnimation(ra)就可以實現(xiàn)在傳感器每次傳回數(shù)值時對指南針進(jìn)行轉(zhuǎn)動,從而實現(xiàn)了指南針的功能。onSensorChanged()的完整代碼如下://接上頁/***以指南針圖像中心為軸旋轉(zhuǎn),從起始度數(shù)currentDegree旋轉(zhuǎn)至targetDegree*/privatevoidrotateCompass(floatcurrentDegree,floattargetDegree){RotateAnimationra;ra=newRotateAnimation(currentDegree,targetDegree,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200); //在200毫秒之內(nèi)完成旋轉(zhuǎn)動作compass.startAnimation(ra);//開始旋轉(zhuǎn)圖像}指南針實現(xiàn)效果在模擬器上開發(fā)傳感器應(yīng)用SensorSimulatorSensorSimulator能夠使你僅僅通過鼠標(biāo)和鍵盤就能夠?qū)崟r的仿真出各種傳感器的數(shù)據(jù),在最新的SensorSimulator版本中甚至還支持了仿真電池電量狀態(tài)、仿真GPS位置的功能,它還能夠“錄制”真機(jī)的傳感器在一段時間內(nèi)的變化情況,以便于為開發(fā)者分析和測試提供材料。OpenIntents項目的下載地址在/p/openintents/downloads/list在模擬器上開發(fā)傳感器應(yīng)用在模擬器上安裝和設(shè)置SensorSimulatorSettings通過在命令提示符下鍵入如下命令來完成安裝:adbinstallSensorSimulatorSettings-2.0-rc1.apkSensorSimulatorSettings界面在模擬器上開發(fā)傳感器應(yīng)用SensorSimulatorPC端應(yīng)用程序在模擬器上開發(fā)傳感器應(yīng)用SensorSimulator連接模擬器成功在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(1)加載感應(yīng)器模擬庫(2)引用感應(yīng)器模擬類庫在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(2)引用感應(yīng)器模擬類庫importorg.openintents.sensorsimulator.hardware.Sensor;importorg.openintents.sensorsimulator.hardware.SensorEvent;importorg.openintents.sensorsimulator.hardware.SensorEventListener;importorg.openintents.sensorsimulator.hardware.SensorManagerSimulator;需要注意的是,其中第01~03行所導(dǎo)入的類與原本的:importandroid.hardware.Sensor;importandroid.hardware.SensorEvent;importandroid.hardware.SensorEventListener;這三條是相沖突的,也正因為如此,模擬器才能夠接收到相應(yīng)的數(shù)據(jù),而新導(dǎo)入的SensorManagerSimulator包與原有的SensorManager卻是可以并存的,也可以說SensorManager包仍然是新版本項目所需要的包,這是因為它還提供了可供使用的一些具名常量。因此,在導(dǎo)入了四個新的類之后,刪除與之沖突的三個類的導(dǎo)入就可以了。在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(3)修改AndroidManifest.xml由于手機(jī)需要通過網(wǎng)絡(luò)連接到SensorSimulator,因此需要在AndroidManifest.xml加入對網(wǎng)絡(luò)的使用權(quán)限:<uses-permissionandroid:name="android.permission.INTERNET"></uses-permission>在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(4)修改SensorManager相關(guān)代碼另外還需要替換的是獲取SensorManager實例的代碼,因為SensorManager是用于管理傳感器的,而原有的獲取其實例的方法顯然是不能夠是用于仿真出來的傳感器的,因此,替換:mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);為如下代碼:mSensorManager=SensorManagerSimulator.getSystemService(this,SENSOR_SERVICE);從而獲取到用于管理仿真出來的傳感器的SensorManager,之后,還需要通過如下方法使得該應(yīng)用程序連接到SensorSimulator:mSensorManager.connectSimulator();//連接到仿真器在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(5)運行測試,狀態(tài)1在模擬器上開發(fā)傳感器應(yīng)用修改代碼使指南針工作在模擬器上(5)運行測試,狀態(tài)2計步器計步器介紹什么是計步器呢?顧名思義,計步器就是用于計算一個人所走過的步數(shù),市面上銷售的一些計步器往往還帶有其他一些非常豐富的功能,如估算一個人所消耗的能量、估算所走過的距離等等。但這些功能都是建立在準(zhǔn)確的測定了人所走的步數(shù)之上的,那么如何準(zhǔn)確的測定步數(shù)呢?這就需要借助于傳感器了,如何處理、統(tǒng)計傳感器的數(shù)據(jù),就決定了測定步數(shù)的準(zhǔn)確性。Android提供了眾多傳感器的支持,實現(xiàn)一個簡易的計步器當(dāng)然也是手到擒來了。下面就在Android平臺上來實現(xiàn)一個簡易的計步器應(yīng)用。計步器計步器所需傳感器分析(1)加速度傳感器——Accelerometer加速度傳感器所測量的是所有施加在設(shè)備上的力所產(chǎn)生的加速度(包括了重力加速度)的負(fù)值(這個負(fù)值是參照圖8-1的世界坐標(biāo)系而言的,因為默認(rèn)手機(jī)的朝向是向上,而重力加速度則朝下,這里所取為負(fù)值可以與大部分人的認(rèn)知觀念相符——即手機(jī)朝上時,傳感器的數(shù)值為正)。加速度所使用的單位是m/s2,其更新時所返回的SensorEvent.values[]數(shù)組的各值含義分別為:SensorEvent.values[0]:加速度在X軸的負(fù)值;SensorEvent.values[1]:加速度在Y軸的負(fù)值;SensorEvent.values[2]:加速度在Z軸的負(fù)值。計步器計步器所需傳感器分析(2)重力加速度傳感器——Gravity重力加速度傳感器,其單位也是m/s2,其坐標(biāo)系與加速度傳感器一致。當(dāng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論