Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發:Android設備傳感器開發總結

Android開發:Android設備傳感器開發總結

編輯:關於Android編程

 

 

Android傳感器開發基本流程

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mSensor;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //第一步:通過getSystemService獲得SensorManager實例對象
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    //第二步:通過SensorManager實例對象獲得想要的傳感器對象:參數決定獲取哪個傳感器
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  }

  //第四步:必須重寫的兩個方法:onAccuracyChanged,onSensorChanged
  /**
   * 傳感器精度發生改變的回調接口
   */
  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    //TODO 在傳感器精度發生改變時做些操作,accuracy為當前傳感器精度
  }

  /**
   * 傳感器事件值改變時的回調接口:執行此方法的頻率與注冊傳感器時的頻率有關
   */
  @Override
  public final void onSensorChanged(SensorEvent event) {
    // 大部分傳感器會返回三個軸方向x,y,x的event值,值的意義因傳感器而異
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
    //TODO 利用獲得的三個float傳感器值做些操作
  }

  /**
   * 第三步:在獲得焦點時注冊傳感器並讓本類實現SensorEventListener接口
   */
  @Override
  protected void onResume() {
    super.onResume();
    /*
     *第一個參數:SensorEventListener接口的實例對象
     *第二個參數:需要注冊的傳感器實例
     *第三個參數:傳感器獲取傳感器事件event值頻率:
   *              SensorManager.SENSOR_DELAY_FASTEST = 0:對應0微秒的更新間隔,最快,1微秒 = 1 % 1000000秒
   *              SensorManager.SENSOR_DELAY_GAME = 1:對應20000微秒的更新間隔,游戲中常用
   *              SensorManager.SENSOR_DELAY_UI = 2:對應60000微秒的更新間隔
   *              SensorManager.SENSOR_DELAY_NORMAL = 3:對應200000微秒的更新間隔
   *              鍵入自定義的int值x時:對應x微秒的更新間隔
     *
     */
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
  }

  /**
   * 第五步:在失去焦點時注銷傳感器
   */
  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }
}

總結起來大致有5步: 第一步:獲取SensorManager對象 第二步:獲取Sensor對象 第三步:注冊Sensor對象 第四步:重寫onAccuracyChanged,onSensorChanged這兩個方法 第五步:注銷Sensor對象

Android設備中傳感器的基本類型


利用SensorManager獲取傳感器:
mSensor = mSensorManager.getDefaultSensor(int TYPE);//TYPE為Sensor中定義的static final 值

請參考下面Sensor.java中定義的部分TYPE值:
    /**
     * 獲取加速度感應器的常量
     */
    public static final int TYPE_ACCELEROMETER = 1;

    /**
     * 獲取磁場感應器的常量
     */
    public static final int TYPE_FIELD = 2;

    /**
     * 獲取方向感應器的常量,已過時
     */
    @Deprecated
    public static final int TYPE_ORIENTATION = 3;

    /** 
     * 獲取陀螺儀感應器的常量
     */
    public static final int TYPE_GYROSCOPE = 4;

    /**
     * 獲取光線感應器的常量
     */
    public static final int TYPE_LIGHT = 5;

    /**
     * 獲取壓力感應器的常量
     */
    public static final int TYPE_PRESSURE = 6;

    @Deprecated
    public static final int TYPE_TEMPERATURE = 7;//獲取溫度傳感器,已過時

    /**
     * 獲取距離感應器的常量
     */
    public static final int TYPE_PROXIMITY = 8;

    /**
     * 獲取重力感應器的常量
     */
    public static final int TYPE_GRAVITY = 9;

    /**
     * 獲取線性加速度感應器的常量
     */
    public static final int TYPE_LINEAR_ACCELERATION = 10;

    /**
     * 獲取旋轉矢量感應器的常量
     */
    public static final int TYPE_ROTATION_VECTOR = 11;

    /**
     * 獲取相對濕度感應器的常量
     */
    public static final int TYPE_RELATIVE_HUMIDITY = 12;

    /**
     * 獲取溫度感應器的常量:取締了public static final int TYPE_TEMPERATURE = 7;
     */
    public static final int TYPE_AMBIENT_TEMPERATURE = 13;


Android設備中傳感器event值解釋


加速度傳感器

加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。
該數值包含地心引力的影響,單位是m/s^2。
將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81。
將手機朝下放在桌面上,z軸為-9.81。
將手機向左傾斜,x軸為正值。
將手機向右傾斜,x軸為負值。
將手機向上傾斜,y軸為負值。
將手機向下傾斜,y軸為正值。

磁力傳感器

磁力傳感器簡稱為M-sensor,返回x、y、z三軸的環境磁場數據。
該數值的單位是微特斯拉(micro-Tesla),用uT表示。
單位也可以是高斯(Gauss),1Tesla=10000Gauss。
硬件上一般沒有獨立的磁力傳感器,磁力數據由電子羅盤傳感器提供(E-compass)。
電子羅盤傳感器同時提供下文的方向傳感器數據。

方向傳感器

方向傳感器簡稱為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個象限。

陀螺儀傳感器

陀螺儀傳感器叫做Gyro-sensor,返回x、y、z三軸的角速度數據。
角速度的單位是radians/second。
根據Nexus S手機實測:
水平逆時針旋轉,Z軸為正。
水平逆時針旋轉,z軸為負。
向左旋轉,y軸為負。
向右旋轉,y軸為正。
向上旋轉,x軸為負。
向下旋轉,x軸為正。

光線感應傳感器

光線感應傳感器檢測實時的光線強度,光強單位是lux,其物理意義是照射到單位面積上的光通量。
光線感應傳感器主要用於Android系統的LCD自動亮度功能。
可以根據采樣到的光強數值實時調整LCD的亮度。

壓力傳感器

壓力傳感器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。

溫度傳感器

溫度傳感器返回當前的溫度。

距離傳感器

又稱接近傳感器,檢測物體與手機的距離,單位是厘米。
一些接近傳感器只能返回遠和近兩個狀態,
因此,接近傳感器將最大距離返回遠狀態,小於最大距離返回近狀態。
接近傳感器可用於接聽電話時自動關閉LCD屏幕以節省電量。
一些芯片集成了接近傳感器和光線傳感器兩者功能。


重力傳感器

重力傳感器簡稱GV-sensor,輸出重力數據。
在地球上,重力數值為9.8,單位是m/s^2。
坐標系統與加速度傳感器相同。
當設備復位時,重力傳感器的輸出與加速度傳感器相同。

線性加速度傳感器

線性加速度傳感器簡稱LA-sensor。
線性加速度傳感器是加速度傳感器減去重力影響獲取的數據。
單位是m/s^2,坐標系統與加速度傳感器相同。
加速度傳感器、重力傳感器和線性加速度傳感器的計算公式如下:
加速度 = 重力 + 線性加速度

旋轉矢量傳感器

旋轉矢量傳感器簡稱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)

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved