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)組成一個四元組。