Android傳感器簡單總結

後續不斷完善

概述

Android 平臺支持三大類傳感器:

  • 動態傳感器

這類傳感器測量三個軸向上的加速力和旋轉力。這個類別中包含加速度計、重力傳感器、陀螺儀和旋轉矢量傳感器。

  • 環境傳感器

這類傳感器測量各種環境參數,如環境氣溫、氣壓、照度和溼度。這個類別中包含氣壓計、光度計和溫度計。

  • 位置傳感器

這類傳感器測量設備的物理位置。這個類別中包含屏幕方向傳感器和磁力計。

具體類型

傳感器 說明 常見用途
TYPE_ACCELEROMETER 測量在所有三個物理軸向(x、y 和 z)上施加在設備上的加速力(包括重力),以 m/s2 爲單位。 動態檢測(搖晃、傾斜等)。
TYPE_GRAVITY 測量在所有三個物理軸向(x、y、z)上施加在設備上的重力,單位爲 m/s2。 動態檢測(搖晃、傾斜等)。
TYPE_GYROSCOPE 測量設備在三個物理軸向(x、y 和 z)上的旋轉速率,以 rad/s 爲單位。 旋轉檢測(旋轉、轉動等)。
TYPE_LINEAR_ACCELERATION 測量在所有三個物理軸向(x、y 和 z)上施加在設備上的加速力(不包括重力),以 m/s2 爲單位。 監測單個軸向上的加速度。
TYPE_ORIENTATION 測量設備圍繞所有三個物理軸(x、y、z)旋轉的度數。從 API 級別 3 開始,您可以結合使用重力傳感器、地磁場傳感器和 getRotationMatrix() 方法來獲取設備的傾角矩陣和旋轉矩陣。 確定設備位置。
TYPE_PROXIMITY 測量物體相對於設備顯示屏幕的距離,以 cm 爲單位。該傳感器通常用於確定手機是否被舉到人的耳邊。 傳感器通常用於確定手機是否被舉到人的耳邊。 通話過程中手機的位置。
TYPE_ROTATION_VECTOR 通過提供設備旋轉矢量的三個元素來檢測設備的屏幕方向。 動態檢測和旋轉檢測。
TYPE_AMBIENT_TEMPERATURE 以攝氏度 (°C) 爲單位測量環境室溫。 監測氣溫。
TYPE_LIGHT 測量環境光級(照度),以 lx 爲單位。 控制屏幕亮度。
TYPE_PRESSURE 測量環境氣壓,以 hPa 或 mbar 爲單位。 監測氣壓變化。
TYPE_RELATIVE_HUMIDITY 測量環境的相對溼度,以百分比 (%) 表示。 監測露點、絕對溼度和相對溼度。

以上的傳感器有的是由硬件支持,有的是由軟件通過多個傳感器結合之後計算支持

基本使用

1.獲取SensorManager對象

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

2.獲取具體的傳感器類型

 //這裏我們除了可以獲取加速度傳感器之外,還可以獲取其他類型的傳感器,如:
        //* Sensor.TYPE_ORIENTATION:方向傳感器。
        //* Sensor.TYPE_GYROSCOPE:陀螺儀傳感器。
        //* Sensor.TYPE_MAGNETIC_FIELD:磁場傳感器。
        //* Sensor.TYPE_GRAVITY:重力傳感器。
        //* Sensor.TYPE_LINEAR_ACCELERATION:線性加速度傳感器。
        //* Sensor.TYPE_AMBIENT_TEMPERATURE:溫度傳感器。
        //* Sensor.TYPE_LIGHT:光傳感器。
        //* Sensor.TYPE_PRESSURE:壓力傳感器。

        // 獲取傳感器的類型
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

3.註冊監聽和解註冊

onResume()中註冊監聽

mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);

註冊時第三個參數指示回調的頻率,基於性能考慮,可選參數如下:


    /** get sensor data as fast as possible 延遲0微秒 */
    public static final int SENSOR_DELAY_FASTEST = 0;
    /** rate suitable for games 延遲 20 000 微秒 */
    public static final int SENSOR_DELAY_GAME = 1;
    /** rate suitable for the user interface 延遲 60 000 微秒  */
    public static final int SENSOR_DELAY_UI = 2;
    /** rate (default) suitable for screen orientation changes  延遲 200,000  微秒*/
    public static final int SENSOR_DELAY_NORMAL = 3;

onStop()中解註冊


mSensorManager.unregisterListener(this);

4.監聽回調方法

上一步中註冊的監聽方法,對應的回調的方法如下


  @Override
    public void onSensorChanged(SensorEvent event) {
       // 回調當前的相關傳感器結果
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 精度發生改變
    }

常用方法

獲取當前設備傳感器列表

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Sensor對象常見屬性

以下是通過toString()打印的對象屬性

{Sensor name="ICM20690 Accelerometer", vendor="InvenSense", version=1, type=1, maxRange=78.4532, resolution=0.0023956299, power=0.325, minDelay=5000}

vendorversion表示製造商和版本,可以根據該字段來判斷是否使用該傳感器,進行區分操作

minDelay:傳感器可用於檢測數據的最小時間間隔(以微秒爲單位,1s = 100萬μs),如果返回0表示數據變化是纔會報告數據,非0表示定時檢測並更新數據

power:傳感器的電量要求

resolution:傳感器的分辨率

MaxRange:最大量程

傳感器座標系

x軸:屏幕向右
y軸:屏幕向上
z軸:垂直屏幕向外

方向傳感器的三個值

而方向傳感器則剛好有三個元素,都表示度數! 對應的含義如下:

  • values[0]:方位角,手機繞着Z軸旋轉的角度。0表示正北(North),90表示正東(East), 180表示正南(South),270表示正西(West)。
  • values[1]:傾斜角,手機翹起來的程度,當手機繞着x軸傾斜時該值會發生變化。取值 範圍是[-180,180]之間。假如把手機放在桌面上,而桌面是完全水平的話,values1的則應該 是0,當然很少桌子是絕對水平的。從手機頂部開始擡起,直到手機沿着x軸旋轉180(此時屏幕 鄉下水平放在桌面上)。在這個旋轉過程中,values[1]的值會從0到-180之間變化,即手機擡起 時,values1的值會逐漸變小,知道等於-180;而加入從手機底部開始擡起,直到手機沿着x軸 旋轉180度,此時values[1]的值會從0到180之間變化。我們可以利用value[1]的這個特性結合 value[2]來實現一個平地尺!
  • value[2]:滾動角,沿着Y軸的滾動角度,取值範圍爲:[-90,90],假設將手機屏幕朝上水平放在 桌面上,這時如果桌面是平的,values2的值應爲0。將手機從左側逐漸擡起,values[2]的值將 逐漸減小,知道垂直於手機放置,此時values[2]的值爲-90,從右側則是0-90;加入在垂直位置 時繼續向右或者向左滾動,values[2]的值將會繼續在-90到90之間變化!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章