產品分類

      當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 力傳感器

      類型分類:
      科普知識
      數據分類:
      力傳感器

      android重力傳感器:Android傳感器【轉】

      發布日期:2022-10-09 點擊率:47


      android重力傳感器:Android傳感器【轉】  第1張

      android重力傳感器:Android傳感器【轉】

      本文轉載自:
      傳感器的意義
      事實上,目前智能手機應用軟件生態系統不斷擴展。傳感器除了能增加體現感和用戶互動這些理念性的東西外。游戲上傳感器的應用也成為新的發展方向。就是體感裝置在游戲設備的崛起一樣,傳感器在手機和平板上的發展會越來越快。現在在游戲、健康照護、體能訓練以及許多新應用都要用到傳感器。
      由于智慧手機中加入了各種傳感器,使手機也變得越來越智慧化。加速度傳感器回應使用者的互動方式,使得傳統平淡無奇的輸入作業,轉變成類似游戲的新奇體驗,進而提高使用者使用智慧手機的意愿。過去智慧手機比較的重點在于是否擁有加速度傳感器,目前變成比較誰的手機具備了三軸陀螺儀,未來則有更多的新的傳感器的加入。
       下面就列舉下大家比較關注也是常見的幾種傳感器(或者叫感應器)
      重力感應器
      手機重力感應技術:利用壓電效應實現,簡單來說是測量內部一片重物(重物和壓電片做成一體)重力正交兩個方向的分力大小,來判定水平方向。通過對力敏感的傳感器,感受手機在變換姿勢時,重心的變化,使手機光標變化位置從而實現選擇的功能。
      手機重力感應指的是手機內置重力搖桿芯片,支持搖晃切換所需的界面和功能,甩歌甩屏,翻轉靜音,甩動切換視頻等,是一種非常具有使用樂趣的功能。
      重力感應器說的簡單點就是,你本來把手機拿在手里是豎著的,你將它轉90度,橫過來,它的頁面就跟隨你的重心自動反應過來,也就是說頁面也轉了90度,極具人性化。現在基本上智能手機都有內置重力感應器,甚至有些非智能手機也有內置。其常見的應用有玩平衡球了,還有橫屏瀏覽網頁、看小說之類的了。
      根據壓電效應的原理來工作的。所謂的壓電效應就是 “對于不存在對稱中心的異極晶體加在晶體上的外力除了使晶體發生形變以外,還將改變晶體的極化狀態,在晶體內部建立電場,這種由于機械力作用使介質發生極化的現象稱為正壓電效應”。
      它采用彈性敏感元件制成懸臂式位移器,與采用彈性敏感元件制成的儲能彈簧來驅動電觸點,完成從重力變化到電信號的轉換。重力傳感器在手機橫豎的時候屏幕會自動轉,在玩游戲可以代替上下左右,比如說玩賽車游戲,可以不通過按鍵,將手機平放,左右搖擺就可以代替模擬機游戲的方向左右移動了。
      重力傳感器就是利用了其內部的由于加速度造成的晶體變形這個特性。由于這個變形會產生電壓,只要計算出產生電壓和所施加的加速度之間的關系,就可以將加速度轉化成電壓輸出。當然,還有很多其它方法來制作加速度傳感器,比如電容效應,熱氣泡效應,光效應,但是其最基本的原理都是由于加速度產生某個 介質產生變形,通過測量其變形量并用相關電路轉化成電壓輸出。手機重力感應指的是手機內置重力搖桿芯片,支持搖晃切換所需的界面和功能,甩歌甩屏,翻轉靜音,甩動切換視頻等,是一種非常具有使用樂趣的功能。
      加速度傳感器
      加速度傳感器是一種能夠測量加速力的電子設備。加速力就是當物體在加速過程中作用在物體上的力,就好比地球引力,也就是重力。加速力可以是個常量,比如g,也可以是變量。因此它的范圍比重力感應器要大,但是一般在手機被提到的加速度感應器時,其實就是指重力感應器,因此兩者可以看做是等價的。
      磁傳感器、加速度傳感器和陀螺儀通常稱為慣性傳感器,常用于各種設備或終端中實現姿態檢測,運動檢測等。這些傳感器提供了各種APP、游戲、軟件成為有趣的現實。加速度傳感器利用重力加速度,可以用于檢測設備的傾斜角度,但是它會受到運動加速度的影響,使傾角測量不夠準確,所以通常需利用陀螺儀和磁傳感器補償。 同時磁傳感器測量方位角時,也是利用地磁場,當系統中電流變化或周圍有導磁材料時,以及當設備傾斜時,測量出的方位角也不準確,這時需要用加速度傳感器(傾角傳感器)和陀螺儀進行補償。而陀螺儀,只有運動時才輸出角速率,靜態時輸出為0,它也很難單獨地確定設備的姿態。所以在實際應用中,通常應用三軸磁傳感器、三軸加速度傳感器和三軸陀螺儀一起確定設備的姿態,以及實現運動檢測。
      方向感應器
      手機方向傳感器是指,安裝在手機上用以檢測手機本身處于何種方向狀態的部件,而不是通常理解的指南針的功能。
      手機方向檢測功能可以檢測手機處于正豎、倒豎、左橫、右橫,仰、俯狀態。具有方向檢測功能的手機具有使用更方便、更具人性化的特點。例如,手機旋轉后,屏幕圖像可以自動跟著旋轉并切換長寬比例,文字或菜單也可以同時旋轉,使你閱讀方便。
      這個兩者是不一樣的,方向感應器或者叫應用角速度傳感器比較合適,一般手機的上的方向感應器是感應水平面上的方位角、旋轉角和傾斜角的。這個如果你可能覺得有點理論的話,舉個例子吧。有方向感應器的能很好的玩都市賽車游戲。而只有重力感應器也能玩,但是恩,很令人糾結。
      三軸陀螺儀
        三軸陀螺儀:即同時測定6個方向的位置,移動軌跡,加速。單軸的只能測量一個方向的量,也就是一個系統需要三個陀螺儀,而3軸的一個就能替代三個單軸的。3軸的體積小、重量輕、結構簡單、可靠性好,是激光陀螺的發展趨勢。對于激光陀螺則更多應用于軍事方面,我們暫且不做討論。不過我們可以看出iPhone4應用的三軸陀螺儀是較為先進的。
      如果說,重力感應器所能測的是直線的,方面感應器所測的是平面得,那么三軸陀螺儀所測的方向和位置則是立體的。特別是玩一些像彩虹六號,那種第一人稱射擊游戲,你會發現三軸陀螺儀的效果是很明顯的。
      陀螺儀就是內部有一個陀螺,陀螺儀一旦開始旋轉,由于輪子的角動量,陀螺儀有抗拒方向改變的特性,它的軸由于陀螺效應始終與初始方向平行,這樣就可以通過與初始方向的偏差計算出實際方向。手機里陀螺儀實際上是一個結構非常精密的芯片,內部包含超微小的陀螺。陀螺儀測量是參考標準是內部中間在與地面垂直的方向上進行轉動的陀螺。通過設備與陀螺的夾角得到結果。陀螺儀的強項在于測量設備自身的旋轉運動。對設備自身運動更擅長。但不能確定設備的方位。
      陀螺儀有單軸陀螺儀和三軸陀螺儀,單軸的只能測量一個方向的量,也就是一個系統需要三個陀螺儀。而三軸陀螺儀可同時測定6個方向的位置,移動軌 跡,加速。所以一個三軸陀螺儀就能替代三個單軸陀螺儀。三軸陀螺儀多用于航海、航天等導航、定位系統,能夠精確地確定運動物體的方位。如今也多用于智能手機當中,比如最早采用該技的蘋果iPhone 4。
      三軸陀螺儀最早由蘋果iPhone 4采用,后來逐漸被各類智能手機所應用。三軸陀螺儀可以測出手機的運動方向,使手機做出正確回應。通過移動手機相應的位置,就可以達到改變方向的目的,同時操作也更加簡便。利用三軸陀螺儀進行體感控制的游戲。 目前手機中采用的三軸陀螺儀用途主要體現在游戲的操控上,有了三軸陀螺儀,我們在玩現代戰爭等第一人稱射擊游戲以及狂野飆車等競技類游戲時,可 以完全摒棄以前通過方向按鍵來控制游戲的操控方式,我們只需要通過移動手機相應的位置,既可以達到改變方向的目的,使游戲體驗更加真實、操作更加靈活。

      距離傳感器
      距離傳感器是利用測時間來實現測距離的原理,以檢測物體的距離的一種傳感器。工作原理:通過發射特別短的光脈沖,并測量此光脈沖從發射到被物體反射回來的時間,通過測時間來計算與物體之間的距離。這個傳感器在手機上的作用是當我們打電話時,手機屏幕會自動熄滅,當你臉離開,屏幕燈會自動開啟,并且自動解鎖。這個對于待機手機較短的智能手機來說是相當實用的。現在很多智能手機都裝備的這個傳感器。
      距離感應器又叫位移傳感器,是利用各種元件檢測對象物的物理變化量,通過將該變化量換算為距離,來測量從傳感器到對象物的距離位移的機器。根據 使用元件不同,分為光學式位移傳感器、線性接近傳感器、超聲波位移傳感器等。距離感應器一般都在手機聽筒的兩側或者是在手機聽筒凹槽中,這樣便于它的工作。當用戶在接聽或撥打電話時,將手機靠近頭部,距離感應器可以測出之間的距離到了一定程度后便通知屏幕背景燈熄滅,拿開時再度點亮背景燈,這樣更方便用 戶操作也更為節省電量。

      光線傳感器(感應器)
      光線傳感器,也就是感光器,也叫做亮度感應器,英文名稱為Light-Sensor,很多平板電腦和手機都配備了該感應器。一般位于手持設備屏幕上方,它能根據手持設備目前所處的光線亮度,自動調節手持設備屏幕亮度,來給使用者帶來最佳視的覺效果。例如在黑暗的環境下,手持設備屏幕背光燈就會自動變暗,否則很刺眼。它的功能是用來感應光線強弱的,然后反饋到手持設備,自動調節屏幕亮度,從而達到省電的目的。
      是能夠根據周圍光亮明暗程度來調節屏幕明暗的裝置。就是在光線強的地方手機會自動關掉鍵盤燈,并且稍微加強屏幕亮度,達到節電并更好觀看屏幕的效果,。
      光線傳感器,一光線感應器一是環境光及接近檢測傳感器,這個傳感器用于改善用戶體驗并延長電池壽命。據介紹,數字環境光傳感器能根據燈光變化(光線亮度)自動調節顯示屏亮度,可減少30%的電源消耗。另外,接近檢測則通過非接觸式技術簡化人機交流。
        二是RGB顏色傳感器,這個傳感器可以迎合更高精度“人眼”顏色傳感器的視覺體驗需求。Jerry Koontz說,目前顏色光學傳感器,是由創新的硅設計和光電二級管配置,有專為模塊機械和光學設計進行優化的紅外阻塞過濾器,實現與人眼相似的光學反應。精確的RGB光線和色溫測量實現顯示器校準備和最佳的圖片質量,RGB顏色傳感器支持環境光感測,提高視覺體驗,并且節能。
        三是手勢識別傳感器。采用非接觸技術的高集成度手勢傳感器,是用光電二極管技術 實現高度可靠、精確的非接觸式用戶界面,精密的手勢引擎可以實現復雜的紅外線手勢感應,具有紅外手勢感知、環境光顏色感知、接近檢測的四合一模塊TMG3992/3可用于優惠券兌換。Jerry Koontz說,手勢識別傳感器電路板面積小于10平方毫米,是為優化系統提供的高集成度的解決方案,可配置的手勢命令使應用更靈活,會推動下一代用戶操作界面的發展。
      光電感應器是由兩個組件即投光器及受光器所組成,利用投光器將光線由透鏡將之聚焦,經傳輸而至受光器之透鏡,再至接收感應器,感應器將收到之光 線訊號轉變成電器信號,此電信訊號更可進一步作各種不同的開關及控制動作,其基本原理即對投光器受光器間之光線做遮蔽之動作所獲得的信號加以運用以完成各 種自動化控制。

      電子羅盤,也叫方位感應器(傳感器)
        電子羅盤,也叫數字指南針,是利用地磁場來定北極的一種方法。古代稱為羅經,現代利用先進加工工藝生產的磁阻傳感器為羅盤的數字化提供了有力的幫助。現在一般有用磁阻傳感器和磁通門加工而成的電子羅盤。這個就是電子版指南針,配合GPS和地圖時非常好用,不會整的暈頭轉向。
      當然除了這些較為常見的傳感器之外,電容屏也是一種傳感器,在女性手機上可以見到紫外線傳感器,在軍用手機上可以看到氣壓和溫度傳感器等等。
      電子羅盤也被廣泛應用于智能手機中,用來導航指向,同時還可以將數字信號接送到自動舵。現代實用的電子羅盤一般能耗低、體積小、重量輕、精度高、內置溫度補償,能夠實現精確導航。
      位移傳感器
      位移傳感器應用于手機中,可以使用戶在接打電話時,感應到用戶頭與手機之間的距離。當頭靠近手機聽筒時,手機屏幕背景燈就會熄滅,當距離再次拉遠時,便會恢復正常背景燈。在智能手機電池續航能力備受吐槽的今天,距離感應器的應用可以為用戶節能更多電量,來提升手機續航能力。
      霍爾傳感器
      霍爾傳感器是一類可直接對磁場及其變化進行檢測的傳感器,通常也間接用于鐵磁物質位置檢測,并起到開關的作用。我們經常看到一些帶皮套的智能手機,當用戶在合上前蓋時,手機能夠自動鎖屏進入休眠狀態并只在有透明開窗部分顯示常用信息方便用戶查看,以起到省電的作用。當有來電信息或者打開翻蓋時,手機會自動激活方便用戶使用。這是由于皮套子的前蓋子中帶有磁性物質,當蓋子合上時,磁性物質與手機近距離接觸,改變了里面霍爾傳感器位置處的磁場大小,從而被傳感器檢測到并輸出電信號值,該信號最終由手機的檢測和控制系統接收到并發出鎖屏休眠指令。同理,打開翻蓋時是一樣的道理。手機皮套子中鐵磁物質除了提供磁場外,另一個作用是與手機里類似物(如話筒)產生磁吸力,方便皮套前蓋的開合使用。
      android重力傳感器:Android傳感器【轉】  第2張

      android重力傳感器:Android手機系統中的重力傳感器+源碼

      Android 手機系統中的重力傳感器+源碼,作者信息:Himi,重力傳感器也稱為加速度傳感器,源代碼編譯環境需要SDK 1.5(api 3)支持。
        此傳感器不僅對玩家反轉手機的動作可以檢測到,而且會根據反轉手機的程度,得到傳感器的值也會不同!
        
        部分源代碼釋義:
        通過服務得到傳感器管理對象
        sm=(SensorManager) MainActivity.ma.getSystemService(Service.SENSOR_SERVICE);
        sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到一個重力傳感器實例
        //TYPE_ACCELEROMETER 加速度傳感器(重力傳感器)類型。
        //TYPE_ALL 描述所有類型的傳感器。
        //TYPE_GYROSCOPE 陀螺儀傳感器類型
        //TYPE_LIGHT 光傳感器類型
        //TYPE_MAGNETIC_FIELD 恒定磁場傳感器類型。
        //TYPE_ORIENTATION 方向傳感器類型。
        //TYPE_PRESSURE 描述一個恒定的壓力傳感器類型
        //TYPE_PROXIMITY 常量描述型接近傳感器
        //TYPE_TEMPERATURE 溫度傳感器類型描述
        mySensorListener=new SensorEventListener() {
        @Override
        //傳感器獲取值發生改變時在響應此函數
         public void onSensorChanged(SensorEvent event) {//備注1
         //傳感器獲取值發生改變,在此處理
         x=event.values[0]; //手機橫向翻滾
         //x>0 說明當前手機左翻 x0 說明當前手機下翻 y0 手機屏幕朝上 z<0 手機屏幕朝下    arc_x -=x;//備注2    arc_y +=y;   }

      android重力傳感器:Android重力加速度傳感器從驅動到應用層全程分析

      1) framework

      ? SensorManager作為系統守護進程運行,其子類SensorThreadRunnable的行為函數run()實現sensors_data_poll(values, status, timestamp),其目的是通過此函數得到從底層傳上來的有關G-sensor的數據values, status和timestamp,再通過此類的一個行為函數listener.onSensorChangedLocked(sensorObject, values, timestamp, accuracy);為上層應用程序提供了得到G-sensor設備數據的接口函數。

      2) JNI

      為sensors_data_poll()提供接口sensors_data_poll(),并執行回調函數sSensorDevice->poll(sSensorDevice, &data);其中,得到的data就是從底層傳上來的G-sensor數據,然后通過下圖的方式將data中對應的數據分別賦給values, status和timestamp。?

      android重力傳感器:Android重力感應開發

      一、手機中常用的傳感器
      在Android2.3 gingerbread系統中,google提供了11種傳感器供應用層使用,具體如下:(Sensor類)
      #define SENSOR_TYPE_ACCELEROMETER 1 //加速度
      #define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
      #define SENSOR_TYPE_ORIENTATION 3 //方向
      #define SENSOR_TYPE_GYROSCOPE 4 //陀螺儀
      #define SENSOR_TYPE_LIGHT 5 //光線感應
      #define SENSOR_TYPE_PRESSURE 6 //壓力
      #define SENSOR_TYPE_TEMPERATURE 7 //溫度
      #define SENSOR_TYPE_PROXIMITY 8 //接近
      #define SENSOR_TYPE_GRAVITY 9 //重力
      #define SENSOR_TYPE_LINEAR_ACCELERATION 10//線性加速度
      #define SENSOR_TYPE_ROTATION_VECTOR 11//旋轉矢量
      1-1加速度傳感器
      加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。
      該數值包含地心引力的影響,單位是m/s^2。
      將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81。
      將手機朝下放在桌面上,z軸為-9.81。
      將手機向左傾斜,x軸為正值。
      將手機向右傾斜,x軸為負值。
      將手機向上傾斜,y軸為負值。
      將手機向下傾斜,y軸為正值。
      加速度傳感器可能是最為成熟的一種mems產品,市場上的加速度傳感器種類很多。
      手機中常用的加速度傳感器有BOSCH(博世)的BMA系列,AMK的897X系列,ST的LIS3X系列等。
      這些傳感器一般提供±2G至±16G的加速度測量范圍,采用I2C或SPI接口和MCU相連,數據精度小于16bit。
      1-2 磁力傳感器
      磁力傳感器簡稱為M-sensor,返回x、y、z三軸的環境磁場數據。
      該數值的單位是微特斯拉(micro-Tesla),用uT表示。
      單位也可以是高斯(Gauss),1Tesla=Gauss。
      硬件上一般沒有獨立的磁力傳感器,磁力數據由電子羅盤傳感器提供(E-compass)。
      電子羅盤傳感器同時提供下文的方向傳感器數據。
      1-3 方向傳感器
      方向傳感器簡稱為O-sensor,返回三軸的角度數據,方向數據的單位是角度。
      為了得到精確的角度數據,E-compass需要獲取G-sensor的數據,
      經過計算生產O-sensor數據,否則只能獲取水平方向的角度。
      方向傳感器提供三個數據,分別為azimuth、pitch和roll。
      azimuth:方位,返回水平時磁北極和Y軸的夾角,范圍為0°至360°。
      0°=北,90°=東,180°=南,270°=西。
      pitch:x軸和水平面的夾角,范圍為-180°至180°。
      當z軸向y軸轉動時,角度為正值。
      roll:y軸和水平面的夾角,由于歷史原因,范圍為-90°至90°。
      當x軸向z軸移動時,角度為正值。
      電子羅盤在獲取正確的數據前需要進行校準,通常可用8字校準法。
      8字校準法要求用戶使用需要校準的設備在空中做8字晃動,
      原則上盡量多的讓設備法線方向指向空間的所有8個象限。
      手機中使用的電子羅盤芯片有AKM公司的897X系列,ST公司的LSM系列以及雅馬哈公司等等。
      由于需要讀取G-sensor數據并計算出M-sensor和O-sensor數據,
      因此廠商一般會提供一個后臺daemon來完成工作,電子羅盤算法一般是公司私有產權。
      1-4 陀螺儀傳感器
      陀螺儀傳感器叫做Gyro-sensor,返回x、y、z三軸的角加速度數據。
      角加速度的單位是radians/second。
      根據Nexus S手機實測:
      水平逆時針旋轉,Z軸為正。
      水平逆時針旋轉,z軸為負。
      向左旋轉,y軸為負。
      向右旋轉,y軸為正。
      向上旋轉,x軸為負。
      向下旋轉,x軸為正。
      ST的L3G系列的陀螺儀傳感器比較流行,iphone4和google的nexus s中使用該種傳感器。
      1-5 光線感應傳感器
      光線感應傳感器檢測實時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
      光線感應傳感器主要用于Android系統的LCD自動亮度功能。
      可以根據采樣到的光強數值實時調整LCD的亮度。
      1-6 壓力傳感器
      壓力傳感器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。
      1-7 溫度傳感器
      溫度傳感器返回當前的溫度。
      1-8 接近傳感器
      接近傳感器檢測物體與手機的距離,單位是厘米。
      一些接近傳感器只能返回遠和近兩個狀態,
      因此,接近傳感器將最大距離返回遠狀態,小于最大距離返回近狀態。
      接近傳感器可用于接聽電話時自動關閉LCD屏幕以節省電量。
      一些芯片集成了接近傳感器和光線傳感器兩者功能。
      下面三個傳感器是Android2新提出的傳感器類型,目前還不太清楚有哪些應用程序使用。
      1-9 重力傳感器
      重力傳感器簡稱GV-sensor,輸出重力數據。
      在地球上,重力數值為9.8,單位是m/s^2。
      坐標系統與加速度傳感器相同。
      當設備復位時,重力傳感器的輸出與加速度傳感器相同。
      1-10 線性加速度傳感器
      線性加速度傳感器簡稱LA-sensor。
      線性加速度傳感器是加速度傳感器減去重力影響獲取的數據。
      單位是m/s^2,坐標系統與加速度傳感器相同。
      加速度傳感器、重力傳感器和線性加速度傳感器的計算公式如下:
      加速度=重力 + 線性加速度
      1-11 旋轉矢量傳感器
      旋轉矢量傳感器簡稱RV-sensor。
      旋轉矢量代表設備的方向,是一個將坐標軸和角度混合計算得到的數據。
      RV-sensor輸出三個數據:
      x*sin(theta/2)
      y*sin(theta/2)
      z*sin(theta/2)
      sin(theta/2)是RV的數量級。
      RV的方向與軸旋轉的方向相同。
      RV的三個數值,與cos(theta/2)組成一個四元組。
      RV的數據沒有單位,使用的坐標系與加速度相同。
      舉例:
      sensors_event_t.data[0]=x*sin(theta/2)
      sensors_event_t.data[1]=y*sin(theta/2)
      sensors_event_t.data[2]=z*sin(theta/2)
      sensors_event_t.data[3]=cos(theta/2)
      GV、LA和RV的數值沒有物理傳感器可以直接給出,
      需要G-sensor、O-sensor和Gyro-sensor經過算法計算后得出。
      算法一般是傳感器公司的私有產權。

      二、Android感應檢測管理---SensorManager

      1、取得SensorManager
      使用感應檢測Sensor首要先獲取感應設備的檢測信號,你可以調用Context.getSysteService(SENSER_SERVICE)方法來取得感應檢測的服務
      2、實現取得感應檢測Sensor狀態的監聽功能
      實現以下兩個SensorEventListener方法來監聽,并取得感應檢測Sensor狀態:
      //在感應檢測到Sensor的精密度有變化時被調用到。
      public void onAccuracyChanged(Senso sensor,int accuracy);
      //在感應檢測到Sensor的值有變化時會被調用到。
      public void onSensorChanged(SensorEvent event);

      3、實現取得感應檢測Sensor目標各類的值

      實現下列getSensorList()方法來取得感應檢測Sensor的值;
      List

      4、注冊SensorListener
      sm.regesterListener(SensorEventListener listener, Sensor sensor, int rate);

      第一個參數:監聽Sensor事件,第二個參數是Sensor目標種類的值,第三個參數是延遲時間的精度密度。延遲時間的精密度參數如下:

      參數
      延遲時間
      SensorManager.SENSOR_DELAY_FASTEST
      0ms
      SensorManager.SENSOR_DELAY_GAME
      20ms
      SensorManager.SENSOR_DELAY_UI
      60ms
      SensorManager.SENSOR_DELAY_NORMAL
      200ms

      因為感應檢測Sensor的服務是否頻繁和快慢都與電池參量的消耗有關,同時也會影響處理的效率,所以兼顧到消耗電池和處理效率的平衡,設置感應檢測Sensor的延遲時間是一門重要的學問,需要根據應用系統的需求來做適當的設置。
      感應檢測Sensor的硬件檢測組件受不同的廠商提供。你可以采用Sensor的getVendor(),Sensor()的getName()和Sensor的getVeesrion()方法來取得 廠商的名稱、產品和版本。

      5、取消注冊
      sm.unregisterListener(SensorEventListener listener)

      6、感應檢測

      加速度感應檢測——Accelerometer
      Accelerometer Sensor測量的是所有施加在設備上的力所產生的加速度的負值(包括重力加速度)。加速度所使用的單位是m/sec^2,數值是加速度的負值。
      SensorEvent.values[0]:加速度在X軸的負值
      SensorEvent.values[1]:加速度在Y軸的負值
      SensorEvent.values[2]:加速度在Z軸的負值
      例如:
      當手機Z軸朝上平放在桌面上,并且從左到右推動手機,此時X軸上的加速度是正數。
      當手機Z軸朝上靜止放在桌面上,此時Z軸的加速度是+9.81m/sec^2。
      當手機從空中自由落體,此時加速度是0
      當手機向上以Am/sec^2的加速度向空中拋出,此時加速度是A+9.81m/sec^2
      重力加速度感應檢測——Gravity
      重力加速度,其單位是m/sec^2,其坐標系與Accelerometer使用的一致。當手機靜止時,gravity的值和Accelerometer的值是一致的。
      線性加速度感應檢測——Linear-Acceleration
      Accelerometer、Gravity和Linear-Acceleration三者的關系如下公式:
      accelerometer=gravity + linear-acceleration
      地磁場感應檢測——Magnetic-field
      地磁場的單位是micro-Tesla(uT),檢測的是X、Y、Z軸上的絕對地磁場。
      陀螺儀感應檢測——Gyroscope
      陀螺儀的單位是弧度/秒,測量的是物體分別圍繞X,Y,Z軸旋轉的角速度。它的坐標系與加速度傳感器的坐標系相同。逆時針方向旋轉的角度正的。也就是說,如果設備逆時針旋轉,觀察者向X,Y,Z軸的正方向看去,就報告設備是正轉的。請注意,這是標準的正旋轉的數學定義。
      光線感應檢測——Light
      values[0]:表示環境光照的水平,單位是SI lux。
      位置逼近感應檢測——Proximity
      values[0]:逼近的距離,單位是厘米(cm)。有一些傳感器只能支持近和遠兩種狀態,這種情況下,傳感器必須報告它在遠狀態下的maximum_range值和在近狀態下的小值。
      旋轉矢量感應檢測——Rotation Vector
      旋轉向量是用來表示設備的方向,它是由角度和軸組成,就是設備圍繞x,y,z軸之一旋轉θ角度。旋轉向量的三個要素是,這樣旋轉向量的大小等于sin(θ/2),旋轉向量的方向等于旋轉軸的方向。
      values[0]: x*sin(θ/2)
      values[1]: y*sin(θ/2)
      values[2]: z*sin(θ/2)
      values[3]: cos(θ/2) (optional: only if value.length=4)
      方向感應檢測——Orientation
      其單位是角度
      values[0]: Azimuth(方位),地磁北方向與y軸的角度,圍繞z軸旋轉(0到359)。0=North, 90=East, 180=South, 270=West
      values[1]: Pitch(俯仰),圍繞X軸旋轉(-180 to 180), 當Z軸向Y軸運動時是正值
      values[2]: Roll(滾),圍繞Y軸旋轉(-90 to 90),當X軸向Z軸運動時是正值

      三、舉例之-Gsensor
      1,圖示三軸方向
      android重力感應系統的坐標系以屏幕的左下方為原點(【注意】2d編程的時候,是以屏幕左上方為原點的),箭頭指向的方向為正。從-10到10,以浮點數為等級單位,想象一下以下情形:
        手機屏幕向上(z軸朝天)水平放置的時侯,(x,y,z)的值分別為(0,0,10);
        手機屏幕向下(z軸朝地)水平放置的時侯,(x,y,z)的值分別為(0,0,-10);
        手機屏幕向左側放(x軸朝天)的時候,(x,y,z)的值分別為(10,0,0);
        手機豎直(y軸朝天)向上的時候,(x,y,z)的值分別為(0,10,0);
        其他的如此類推,規律就是:朝天的就是正數,朝地的就是負數。利用x,y,z三個值求三角函數,就可以精確檢測手機的運動狀態了。

      2,通過監測Gsensor判斷手機處于靜止/移動狀態

      [java] view plaincopy
      public class MainActivity extends Activity implements SensorEventListener {

      private static final String TAG = MainActivity.class.getSimpleName();
      private SensorManager mSensorManager;
      private Sensor mSensor;
      private TextView textviewX;
      private TextView textviewY;
      private TextView textviewZ;
      private TextView textviewF;

      private int mX, mY, mZ;
      private long lasttimestamp = 0;
      Calendar mCalendar;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      textviewX = (TextView) findViewById(R.id.textView1);
      textviewY = (TextView) findViewById(R.id.textView3);
      textviewZ = (TextView) findViewById(R.id.textView4);
      textviewF = (TextView) findViewById(R.id.textView2);

      mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
      mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// TYPE_GRAVITY
      if (null == mSensorManager) {
      Log.d(TAG, "deveice not support SensorManager");
      }
      // 參數三,檢測的精準度
      mSensorManager.registerListener(this, mSensor,
      SensorManager.SENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME

      }

      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {

      }

      @Override
      public void onSensorChanged(SensorEvent event) {
      if (event.sensor == null) {
      return;
      }

      if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
      int x = (int) event.values[0];
      int y = (int) event.values[1];
      int z = (int) event.values[2];
      mCalendar = Calendar.getInstance();
      long stamp = mCalendar.getTimeInMillis() / 1000l;//

      textviewX.setText(String.valueOf(x));
      textviewY.setText(String.valueOf(y));
      textviewZ.setText(String.valueOf(z));

      int second = mCalendar.get(Calendar.SECOND);// 53

      int px = Math.abs(mX - x);
      int py = Math.abs(mY - y);
      int pz = Math.abs(mZ - z);
      Log.d(TAG, "pX:" + px + "  pY:" + py + "  pZ:" + pz + "    stamp:"
      + stamp + "  second:" + second);
      int maxvalue = getMaxValue(px, py, pz);
      if (maxvalue > 2 && (stamp - lasttimestamp) > 30) {
      lasttimestamp = stamp;
      Log.d(TAG, " sensor isMoveorchanged....");
      textviewF.setText("檢測手機在移動..");
      }

      mX = x;
      mY = y;
      mZ = z;

      }
      }

      public int getMaxValue(int px, int py, int pz) {
      int max = 0;
      if (px > py && px > pz) {
      max = px;
      } else if (py > px && py > pz) {
      max = py;
      } else if (pz > px && pz > py) {
      max = pz;
      }

      return max;
      }
      }

      原理就是通過每次得到的x,y,z三軸的值,和下一次的值作比較,它們每個差值中絕對值最大的如果超過某一個閥值(自己定義),并且這種狀態持續了x秒,我們就視為手機處于(顛簸)移動狀態,當然這種判斷肯定是不科學的,有時候也會產生誤判,比較理想的場景就是:攜帶手機坐在公交上或是開車。

      其它可供參考資料:

      下一篇: PLC、DCS、FCS三大控

      上一篇: 電氣控制線路圖控制原

      主站蜘蛛池模板: 日韩一区二区久久久久久| 久久精品视频一区| 福利在线一区二区| 国产色精品vr一区区三区| 一区二区乱子伦在线播放| 国产高清在线精品一区| 欧洲亚洲综合一区二区三区| 另类ts人妖一区二区三区| 中文字幕一区二区三区在线播放| 国产成人精品一区二区三在线观看| 一区二区国产精品| 国内自拍视频一区二区三区| 久久99国产一区二区三区| 成人精品视频一区二区三区尤物| 国产色情一区二区三区在线播放| AA区一区二区三无码精片| 久久久精品人妻一区亚美研究所| 国产无人区一区二区三区| 波多野结衣一区视频在线| 色老头在线一区二区三区| 国模无码一区二区三区不卡| 国产主播福利精品一区二区| 亚洲一区AV无码少妇电影| 亚洲av乱码一区二区三区| 99精品一区二区三区| 波多野结衣一区二区三区88| 在线精品一区二区三区| 国产福利一区二区三区| 亚洲AV无码一区二区三区久久精品 | 国产在线观看一区二区三区四区| 国产精品日本一区二区不卡视频| 国产av福利一区二区三巨| 久久精品中文字幕一区| 免费无码A片一区二三区| 成人免费一区二区三区在线观看| 中文字幕精品一区二区2021年| 日韩三级一区二区三区| 一区二区三区影院| 无码中文人妻在线一区| 久久精品国产一区二区| 久久综合亚洲色一区二区三区|