Android 常見傳感器
最終我們要實現這些:
源碼看這里:
項目源碼
在這之前,我們需要了解關於Android的坐標系:
對於大多數傳感器來說,坐標系統是相對於設備屏幕來說的。
當一個設備被放在其默認的方向上時,X軸是水平指向右的,Y軸是垂直向上的,Z軸是指向屏幕正面之外的,即屏幕背面是Z的負值。
首先,讓Activity實現SensorEventListener接口(實現接口需要復寫onSensorChanged,onAccuracyChanged方法),便於監聽來刷新數據
然后創建SensorManager對象,然后為它注冊加速度傳感器監聽器
//獲取系統服務
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 注冊事件
// * 參數1 :SensorEventListener監聽器
// * 參數2 :Sensor 一個服務可能有多個Sensor實現,此處調用getDefaultSensor獲取默認的Sensor
// * 參數3 :模式 可選數據變化的刷新頻率,多少微秒取一次。
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
加速度傳感器(Accelerometer)
TYPE_ACCELEROMETER
在onSensorChanged()方法中寫入判斷語句,以下判斷語句均寫在這個方法內。
public void onSensorChanged(SensorEvent event) {
//加速度傳感器
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
tvaccelerometer_x.setText("X軸加速度:" + x);
tvaccelerometer_y.setText("Y軸加速度:" + y);
tvaccelerometer_z.setText("Z軸加速度:" + z);
}
}
距離傳感器(Proximity)
TYPE_PROXIMITY
//距離傳感器
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
float x = event.values[0];
tvproximity.setText("距離為:" + x);
}
方向傳感器(Orientation)
TYPE_ORIENTATION
//方向傳感器
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
orientation_x.setText("X軸轉過的角度:" + x);
orientation_y.setText("Y軸轉過的角度:" + y);
orientation_z.setText("Z軸轉過的角度:" + z);
}
X:方位角,手機繞着Z軸旋轉的角度。0表示正北(North),90表示正東(East),
180表示正南(South),270表示正西(West)。假如values[0]的值剛好是這四個值的話,
並且手機沿水平放置的話,那么當前手機的正前方就是這四個方向,可以利用這一點來
寫一個指南針。
Y:傾斜角,手機翹起來的程度,當手機繞着x軸傾斜時該值會發生變化。取值
范圍是[-180,180]之間。假如把手機放在桌面上,而桌面是完全水平的話,values1的則應該
是0,當然很少桌子是絕對水平的。從手機頂部開始抬起,直到手機沿着x軸旋轉180(此時屏幕
鄉下水平放在桌面上)。在這個旋轉過程中,values[1]的值會從0到-180之間變化,即手機抬起
時,values1的值會逐漸變小,知道等於-180;而加入從手機底部開始抬起,直到手機沿着x軸
旋轉180度,此時values[1]的值會從0到180之間變化。我們可以利用value[1]的這個特性結合
value[2]來實現一個平地尺。
Z:滾動角,沿着Y軸的滾動角度,取值范圍為:[-90,90],假設將手機屏幕朝上水平放在
桌面上,這時如果桌面是平的,values2的值應為0。將手機從左側逐漸抬起,values[2]的值將
逐漸減小,知道垂直於手機放置,此時values[2]的值為-90,從右側則是0-90;加入在垂直位置
時繼續向右或者向左滾動,values[2]的值將會繼續在-90到90之間變化。
陀螺儀傳感器(Gyroscope)
TYPE_GYROSCOPE
//陀螺儀傳感器
if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//將弧度傳化成角度
x = (float) Math.toDegrees(x);
y = (float) Math.toDegrees(y);
z = (float) Math.toDegrees(z);
gyroscope_x.setText("X軸角速度:" + x);
gyroscope_y.setText("Y軸角速度:" + y);
gyroscope_z.setText("Z軸角速度:" + z);
}
原本數據為弧度制,這里轉換為角度制,
陀螺儀的XYZ分別代表設備圍繞XYZ三個軸旋轉的角速度。
線性加速度傳感器(LinearAcceleration)
TYPE_LINEAR_ACCELERATION
//線性加速度傳感器
if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
linearacceleration_x.setText("X軸加速度:" + x);
linearacceleration_y.setText("Y軸加速度:" + y);
linearacceleration_z.setText("Z軸加速度:" + z);
}
就是去掉重力加速度后各個方向的加速度
光傳感器(Light)
TYPE_LIGHT
//光傳感器
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
float x = event.values[0];
light.setText("光強為:" + x);
}
感知當前的光強度
壓強傳感器
TYPE_PRESSURE
//壓強傳感器
if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
float x = event.values[0];
pressure.setText("壓強為:" + x + "hPa");
}
壓力傳感器返回當前的壓強,單位是百帕斯卡hectopascal(hPa)。
計步傳感器
TYPE_STEP_COUNTER————計步器(記錄歷史步數累加值)
TYPE_STEP_DETECTOR————檢測器(檢測每次步伐數據)
//計步傳感器
if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
float x = event.values[0];
step_counter.setText("總步數為:" + x);
}
if (event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
float x = event.values[0];
step_detector.setText("步數是否有效:" + x);
}