後續不斷完善
概述
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}
vendor
和version
表示製造商和版本,可以根據該字段來判斷是否使用該傳感器,進行區分操作
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之間變化!