1. 程式人生 > >安卓 傳感器基礎

安卓 傳感器基礎

ports htm div 有效 type() 0ms 類型 event pan

基礎部分

傳感器類型

動作傳感器

這類傳感器在三個軸(X、Y、Z)上測量加速度和旋轉角度。包括如下幾個傳感器。

加速(accelerometer)傳感器

陀螺儀(gyroscope)傳感器

重力(gravity)傳感器

線性加速(linear acceleration)傳感器

旋轉向量(rotational vector)傳感器

環境傳感器

這類傳感器可以測量不同環境的參數,例如周圍環境的空氣溫度和壓強、光照強度和濕度。包括如下幾個傳感器。

溫度(barometer)傳感器

光線(photometer)傳感器

溫度(thermometer)傳感器

壓力(pressure)傳感器

位置傳感器

這類傳感器可以測量設備的物理位置。包括如下幾個傳感器。

方向(orientation)傳感器(數據來自加速傳感器和磁場傳感器)

磁場(magnetomenter)傳感器

安卓傳感器類型

TYPE_ACCELEROMETER //加速度傳感器(硬件)

TYPE_MAGNETIC_FIELD //磁場傳感器(硬件)

TYPE_ORIENTATION //方向傳感器(軟件傳感器,數據來自重力和磁場傳感器)

TYPE_GYROSCOPE //陀螺儀傳感器(硬件)

TYPE_LIGHT //光線傳感器(硬件)

TYPE_PRESSURE //壓力傳感器(硬件)

TYPE_PROXIMITY //臨近傳感器(硬件)

TYPE_GRAVITY //重場傳感器(硬件或軟件)

TYPE_LINEAR_ACCELERATION //線性加速度傳感器(硬件或軟件)

TYPE_ROTATION_VECTOR //旋轉矢量傳感器(硬件或軟件)

TYPE_RELATIVE_HUMIDITY //濕度傳感器(硬件)

TYPE_AMBIENT_TEMPERATURE //溫度傳感器(硬件)

TYPE_TEMPERATURE //溫度傳感器(硬件),從Android4.0開始被TYPE_AMBIENT_TEMPERATURE取代

安卓傳感器參數

傳感器回調頻率

參數

延遲時間

SensorManager.SENSOR_DELAY_FASTEST

0ms

SensorManager.SENSOR_DELAY_GAME

20ms

SensorManager.SENSOR_DELAY_UI

60ms

SensorManager.SENSOR_DELAY_NORMAL

200ms

傳感器返回值@link

加速度感應檢測——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軸運動時是正值

API:

獲取系統支持傳感器類型
    /**
     * 支持傳感器列表
     *  http://blog.csdn.net/redoq/article/details/52515123
     *  https://zhidao.baidu.com/question/2205380242168742428.html
     *  http://www.jianshu.com/p/4c141d851346
     */
    private void testSupportSensorList(){
        SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        String sensorStr = "";
        List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);
        for (Sensor sensor:list){
            sensorStr += sensor.getName() + "\n";
        }
        XLog.i(sensorStr);
        sensorStr = "";
        for (Sensor sensor:list){
            switch (sensor.getType()){
                case Sensor.TYPE_ACCELEROMETER:
                    sensorStr += "加速度傳感器" + "\n";
                    break;
                case Sensor.TYPE_MAGNETIC_FIELD:
                    sensorStr += "磁場傳感器" + "\n";
                    break;
                case Sensor.TYPE_ORIENTATION:
                    sensorStr += "方向傳感器" + "\n";
                    break;
                case Sensor.TYPE_GYROSCOPE:
                    sensorStr += "陀螺儀傳感器" + "\n";
                    break;
                case Sensor.TYPE_LIGHT:
                    sensorStr += "光線傳感器" + "\n";
                    break;
                case Sensor.TYPE_PRESSURE:
                    sensorStr += "壓力傳感器" + "\n";
                    break;
                case Sensor.TYPE_PROXIMITY:
                    sensorStr += "臨近傳感器" + "\n";
                    break;
                case Sensor.TYPE_GRAVITY:
                    sensorStr += "重場傳感器" + "\n";
                    break;
                case Sensor.TYPE_LINEAR_ACCELERATION:
                    sensorStr += "線性加速度傳感器" + "\n";
                    break;
                case Sensor.TYPE_ROTATION_VECTOR:
                    sensorStr += "旋轉矢量傳感器" + "\n";
                case Sensor.TYPE_RELATIVE_HUMIDITY:
                    sensorStr += "濕度傳感器" + "\n";
                    break;
                case Sensor.TYPE_AMBIENT_TEMPERATURE:
                    sensorStr += "溫度傳感器" + "\n";
                    break;
                case Sensor.TYPE_TEMPERATURE:
                    sensorStr += "溫度傳感器" + "\n";
                    break;
            }
        }
        XLog.i(sensorStr);
}
傳感器使用步驟(通用)
s1、使用傳感器之前首先獲取SensorManager通過系統服務獲取:
SensorManager  mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

s2、獲取我們需要的傳感器類型:
//單次有效計步
Sensor  mStepCount = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
//系統計步累加值
Sensor  mStepDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

s3、註冊監聽者(監聽傳感器事件)
mSensorManager.registerListener(this, mStepDetector, SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(this, mStepCount, SensorManager.SENSOR_DELAY_FASTEST);

PS:取消註冊:
mSensorManager.unregisterListener(this, mStepDetector);
mSensorManager.unregisterListener(this, mStepCount);

s4、實現SensorEventListener接口,重寫方法並獲取數據
@Override
public void onSensorChanged(SensorEvent event) 

參考:

http://blog.csdn.net/mad1989/article/details/20848181

如何獲取Android設備所支持的傳感器種類

android 判斷支持哪些傳感器

Android-關於傳感器你需要知道的

安卓 傳感器基礎