Android感應器的環境監控

來源:互聯網
上載者:User

Android 感應器可以隨處監控環境

    如:方向、加速表、光線、磁場、臨近性、溫度等

    android.hardware.SensorManager 包含幾個常量,這表示 Android 感應器系統的不同方面,包括:


  感應器類型方向、加速表、光線、磁場、臨近性、溫度等。採樣率最快、遊戲、普通、使用者介面。當應用程式請求特定的採樣率時,其實只是對感應器子系統的一個提示,或者一個建議。不保證特定的採樣率可用。準確性高、低、中、不可靠。


  SensorListener 介面是感應器應用程式的中心。它包括兩個必需方法:


  onSensorChanged(int sensor,float values[]) 方法在感應器值更改時調用。該方法只對受此應用程式監視的感應器調用(更多內容見下文)。該方法的參數包括:一個整數,指示更改的感應器;一個浮點值數組,表示感應器資料本身。有些感應器只提供一個資料值,另一些則提供三個浮點值。方向和加速表感應器都提供三個資料值。


  當感應器的準確性更改時,將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個整數:一個表示感應器,另一個表示該感應器新的準確值。


  要與感應器互動,應用程式必須註冊以偵聽與一個或多個感應器相關的活動。註冊使用 SensorManager 類的registerListener 方法完成。本文中的 程式碼範例 示範了如何註冊和登出 SensorListener。
樣本1:

    import android.app.Activity; 

    import  android.os.Bundle; 

    import android.util.Log; 

    import  android.widget.TextView; 

    import android.hardware.SensorManager; 

    import  android.hardware.SensorListener; 

    public class IBMEyes extends  Activity implements SensorListener { 

      final String tag = "IBMEyes";  

      SensorManager sm = null; 

      TextView xViewA = null; 

       TextView yViewA = null; 

      TextView zViewA = null; 

      TextView  xViewO = null; 

      TextView yViewO = null; 

      TextView zViewO =  null; 

     

      /** Called when the activity is first created. */ 

      @Override 

      public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        // get reference to  SensorManager 

        sm = (SensorManager)  getSystemService(SENSOR_SERVICE); 

        setContentView(R.layout.main);  

        xViewA = (TextView) findViewById(R.id.xbox); 

        yViewA =  (TextView) findViewById(R.id.ybox); 

        zViewA = (TextView)  findViewById(R.id.zbox); 

        xViewO = (TextView)  findViewById(R.id.xboxo); 

        yViewO = (TextView)  findViewById(R.id.yboxo); 

        zViewO = (TextView)  findViewById(R.id.zboxo); 

      } 

      public void onSensorChanged(int  sensor, float[] values) { 

        synchronized (this) { 

           Log.d(tag, "onSensorChanged: " + sensor + ", x: " + 

    values[0] + ",  y: " + values[1] + ", z: " + values[2]); 

          if (sensor ==  SensorManager.SENSOR_ORIENTATION) { 

             xViewO.setText("Orientation X: " + values[0]); 

             yViewO.setText("Orientation Y: " + values[1]); 

             zViewO.setText("Orientation Z: " + values[2]); 

          } 

          if  (sensor == SensorManager.SENSOR_ACCELEROMETER) { 

             xViewA.setText("Accel X: " + values[0]); 

             yViewA.setText("Accel Y: " + values[1]); 

             zViewA.setText("Accel Z: " + values[2]); 

          }       

        } 

      } 

       

      public void onAccuracyChanged(int sensor, int accuracy)  { 

       Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " +  accuracy); 

      } 

      @Override 

      protected void onResume() { 

        super.onResume(); 

       // register this class as a listener for the  orientation and accelerometer sensors 

        sm.registerListener(this,  

            SensorManager.SENSOR_ORIENTATION  |SensorManager.SENSOR_ACCELEROMETER, 

             SensorManager.SENSOR_DELAY_NORMAL); 

      } 

       

      @Override 

      protected void onPause()() { 

        // unregister listener 

         sm.unregisterListener(this); 

        super.onPause()(); 

      }   

    } 

該活動的 onCreate 方法可以引用 SensorManager,其中包含所有與感應器有關的函數。

onCreate 方法還建立了對 6 個 TextView 小組件的引用,您需要使用感應器資料值更新這些小組件。


  onResume() 方法使用對 SensorManager 的引用通過 registerListener 方法註冊感應器更新:


  第一個參數是實現 SensorListener 介面的類的執行個體。


  第二個參數是所需感應器的位元遮罩。在本例中,應用程式從 SENSOR_ORIENTATION 和 SENSOR_ACCELEROMETER 請求資料。


  第三個參數是一個系統提示,指出應用程式更新感應器值所需的速度。


  應用程式(活動)暫停後,需要登出接聽程式,這樣以後就不會再收到感應器更新。

這通過 SensorManager 的 unregisterListener 方法實現。惟一的參數是 SensorListener 的執行個體。


  在 registerListener 和 unregisterListener 方法調用中,應用程式使用關鍵字 this。

注意類定義中的 implements 關鍵字,其中聲明了該類實現 SensorListener 介面。這就是要將它傳遞到 registerListener 和 unregisterListener 的原因。


  SensorListener 必須實現兩個方法 onSensorChange 和 onAccuracyChanged。

應用程式範例不關心感應器的準確度,但關注感應器當前的 X、Y 和 Z 值。

onAccuracyChanged 方法實質上不執行任何操作;它只在每次調用時添加一個日誌項。


  似乎經常需要調用 onSensorChanged 方法,因為加速表和方向感應器正在快速發送資料。

查看第一個參數確定哪個感應器在發送資料。確認了發送資料的感應器之後,

將使用方法第二個參數傳遞的浮點值數組中所包含的資料更新相應的 UI 元素

注意:在不用對感應器進行監聽時,一定要及時的取消監聽。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.