29.Android 傳感器

29.Android 傳感器


Android 傳感器介紹

Android的傳感器大多都跟手機的硬件有關,有些傳感器還跟手機的軟件與硬件都相關。

很多人很迷茫,什麼叫傳感器呀?其實傳感器就是一系列手機內部自帶的測量儀器。可以用來測量方向、距離、磁力、光線等等(包括你知道的和你很多不知道的)。


Android SensorManager

想要拿到手機上的傳感器管理器(SensorManager),還是需要通過Activity.getSystemService(@ServiceName @NonNull String name)

// 獲取傳感器管理器
SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
// 獲得全部的傳感器列表
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Sensor的類型

這裏介紹主流的11種Sensor。

Type Name Value
TYPE_ACCELEROMETER 加速度傳感器 1
TYPE_MAGNETIC_FIELD 磁力傳感器 2
TYPE_ORIENTATION 方向傳感器 3
TYPE_GYROSCOPE 陀螺儀傳感器 4
TYPE_LIGHT 光線感應傳感器 5
TYPE_PRESSURE 壓力傳感器 6
TYPE_TEMPERATURE 溫度傳感器 7
TYPE_PROXIMITY 距離傳感器 8
TYPE_GRAVITY 重力傳感器 9
TYPE_LINEAR_ACCELERATION 線性加速度傳感器 10
TYPE_ROTATION_VECTOR 旋轉矢量傳感器 11

Sensor API

最大取值範圍
Sensor.getMaximumRange()

設備名稱
Sensor.getName()

功率
Sensor.getPower()

精度
Sensor.getResolution()

傳感器類型
Sensor.getType()

設備供應商
Sensor.getVentor()

設備版本號
Sensor.getVersion()


Sensor 監聽

根據傳感器的Type獲取該Type默認配置的傳感器
SensorManager。getDefaultSensor(int type)

以監聽加速度傳感器爲例,可以拿到傳感器測量的數據。

        // 獲取默認加速度傳感器
        Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        /**
         * 傳感器監聽
         * SensorEvent.values[0] = x
         * SensorEvent.values[1] = y
         * SensorEvent.values[2] = z
         */
        SensorEventListener listener = new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                String info = "";
                for (int i = 0; i < event.values.length; i++) {
                    info += "event.values[" + i + "]:" + event.values[i] + "\t";
                }
                Log.i("SensorManagerActivity", info);
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        };

        // 給對應傳感器添加監聽
        sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

SensorEvent中values的x y z含義


加速度傳感器(G-sensor)

x、y、z的值分別表示在x、y、z軸上的加速度

這三個數值是都到地心引力的影響,單位是m/s^2

手機平放,x軸默認爲0,y軸默認0,z軸默認9.8。

  • 向左加速運動,x軸爲正值。
  • 向右加速運動,x軸爲負值。
  • 向上加速運動,y軸爲負值。
  • 向下加速運動,y軸爲正值。

磁力傳感器(M-sensor)

x、y、z的值分別表示在x、y、z軸上的環境磁場數據

單位是微特斯拉(micro-Tesla),用uT表示

同時也能換算成高斯(Gauss),1Tesla=10000Gauss


方向傳感器(O-sensor)

x、y、z的值分別表示在x、y、z軸上的角度數據

單位是角度

x、y、z的值詳細的角度數據對應爲:azimuth、pitch、roll

  • azimuth:方位,返回水平時磁北極和Y軸的夾角,範圍爲0°~360°。
    0°=北,90°=東,180°=南,270°=西。

  • pitch:x軸和水平面的夾角,範圍爲-180°~180°。
    當z軸向y軸轉動時,角度爲正值。

  • roll:y軸和水平面的夾角,範圍爲-90°~90°。
    當x軸向z軸移動時,角度爲正值。


陀螺儀傳感器(Gyro-sensor)

x、y、z的值分別表示在x、y、z軸上的角加速度數據

單位是radians/second

  • 水平逆時針旋轉,z軸爲正。
  • 水平順時針旋轉,z軸爲負。
  • 水平向左旋轉,y軸爲負。
  • 水平向右旋轉,y軸爲正。
  • 水平向上旋轉,x軸爲負。
  • 水平向下旋轉,x軸爲正。

光線感應傳感器

x值表示檢測到的實時光線強度, 範圍在0~未知(我的手機上最大可以到46000)

單位是lux,是照射到單位面積上的光通量。

光線感應傳感器主要用於Android系統的LCD自動亮度功能

可以根據採樣到的光強數值實時調整LCD的亮度


壓力傳感器

返回當前的壓強(目前我的手機上沒有這個傳感器 –Moto X Style)。

單位是百帕斯卡hectopascal(hPa)


溫度傳感器

返回當前的溫度。(目前我的手機上沒有這個傳感器 –Moto X Style)。


距離傳感器

x的值返回物體與手機屏幕的距離。範圍爲0~100。

單位是釐米

可用於接聽電話時自動關閉LCD屏幕以節省電量

一些芯片集成了接近傳感器和光線傳感器兩者功能。


重力傳感器(GV-sensor)

z值返回重力數據

地球上,重力數值爲9.8,單位是m/s^2

手機平放,顯示的數據和加速度傳感器顯示的數據一樣


線性加速度傳感器(LA-sensor)

線性加速度傳感器是加速度傳感器減去重力影響獲取的數據

單位是m/s^2

線性加速度 = 加速度 - 重力

手機平放時,重力數據又和加速數據一樣。所以此時,線性加速度的默認數據爲:x=0,y=0,z=0。


旋轉矢量傳感器(RV-sensor)

這個太複雜了!建議不要去玩這個了。

旋轉矢量代表設備的方向,是一個將座標軸和角度混合計算得到的數據。

RV-sensor輸出三個數據:

value[0] = x*sin(theta/2)
value[1] = y*sin(theta/2)
value[2] = z*sin(theta/2)

sin(theta/2)是RV的數量級。

RV的方向與軸旋轉的方向相同。

RV的三個數值,與cos(theta/2)組成一個四元組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章