1. 程式人生 > >安卓手機傳感器的使用

安卓手機傳感器的使用

pseudo bsp 常量 獲得 div val 方法 ota gis



現在的安卓手機中都有各種各樣的傳感器,比如加速度傳感器、陀螺儀之類的,我現在用的vivo v3手機中總共九種傳感器分別為:

lis3dh-accel :三軸加速度傳感器

TMD277X-proximity :近距離傳感器

TMD277X-light :光線傳感器

yas533-orientation :方向傳感器

yas533-pseudo-gyro :運動傳感器

yas533-linear-acceleration : 線加速度傳感器

yas533-rotation-vector :旋轉矢量傳感器

yas533-gravity :陀螺儀

yas533-mag :磁力傳感器

以上傳感器是自己寫的一個程序測出來的。

操作手機中的傳感器無非這幾個步驟:

  1. 獲取傳感器管理者
  2. 獲取傳感器對象
  3. 註冊傳感器監聽
  4. 在傳感器監聽中獲取數據(數據改變事件)

首先第一步:獲取傳感器管理者

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);//獲取傳感器管理者

sensorManager中有幾個重要的方法:

  • getSensorList(int type) 返回list集合,集合中是手機內所有的傳感器對象(sensor)
  • getDefaultSensor(int type) 返回type指定的傳感器對象,如 Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 獲取的是加速度傳感器對象
  • registerListener(SensorListener listener, int sensors, int rate) 註冊傳感器監聽事件

第二步:獲取傳感器對象

Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//獲取傳感器對象

傳感器對象主要用於確定要操作的是什麽傳感器,上例中是(三軸)加速度傳感器

  • Sensor類中有許多 TYPE_xxxx 的int值常量,這些常量每一個表示不同的傳感器,主要用於獲取傳感器對象時確定傳感器類型
  • getName() 獲得傳感器名字
  • getPower() 獲得傳感器功率,單位不詳
  • getResolution() 獲得傳感器分辨率
  • getType() 獲得傳感器類型
  • getVendor() 獲得傳感器制造商
  • getVersion()獲得傳感器版本

第三步:註冊傳感器監聽事件

使用SensorManager中的

/**
 * 
 * @param listener 監聽事件接口
 * @param sensors 傳感器對象
 * @param rate 采樣率,值必須是 SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI, SENSOR_DELAY_GAME, or SENSOR_DELAY_FASTEST 的其中一個
 */
registerListener(SensorEventListener listener, int sensors, int rate)

  • 創建一個類實現監聽器的SensorEventListener接口,並且實現其中兩個方法:傳感器數值改變時回調的 onSensorChanged(SensorEvent event) 方法 、分辨率改變回調的 onAccuracyChanged(int sensor, int accuracy)方法 (重點)
  • onSensorChanged(SensorEvent event) 方法中使用 event.values 獲取float數組,數組的值即為測量值,具體操作方法詳見API
  • 第二個參數傳入傳感器對象
  • 第三個參數時采樣率,
    SENSOR_DELAY_NORMAL  200000μs取樣一次
    SENSOR_DELAY_UI 60000μs取樣一次
    SENSOR_DELAY_GAME   2000μs取樣一次
    SENSOR_DELAY_FASTEST   0μs取樣一次(以cpu最快取樣速率進行)

例如:

sensorManager.registerListener(new accelListener(), accelSensor, SensorManager.SENSOR_DELAY_NORMAL);//註冊傳感器監聽事件
    /**
     * 內部類,實現SensorEventListener 接口
     * @author Administrator
     *
     */
    class accelListener implements SensorEventListener{
        /*
         * 傳感器數值改變時回調
         * @see android.hardware.SensorEventListener#onSensorChanged(android.hardware.SensorEvent)
         */
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            float i= event.values[0];
                        System.out.print(i);
                        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
            
        }
        
    }    

Android Develop API android.hardware有傳感器獲取方法、算法的詳細描述,希望各位親認真閱讀。

安卓手機傳感器的使用