Android開發:Android裝置感應器開發總結

來源:互聯網
上載者:User

標籤:android   sensormanager   sensor   感應器開發   

本文中,筆者給大家分享一下Android中如何進行Android裝置感應器開發。

轉載請註明作者xiong_it和連結:http://blog.csdn.net/xiong_it/article/details/45917009


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)

參考連結:http://my.oschina.net/jerikc/blog/167499

轉載請註明作者xiong_it和連結:http://blog.csdn.net/xiong_it/article/details/45917009

Android開發:Android裝置感應器開發總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.