监视传感器事件
要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()和onSensorChanged()。Android系统在任何发生下列事情的时候都会调用这两个方法:
- 传感器精度的改变:
这种情况中,系统会调用onAccuracyChanged()方法,它提供了你要引用的发生精度变化的Sensor对象。精度使用以下四个状态常量之一来代表的:
SENSOR_STATUS_ACCURACY_LOW
SENSOR_STATUS_ACCURACY_MEDIUM
SENSOR_STATUS_ACCURACY_HIGH
SENSOR_STATUS_UNRELIABLE
- 传感器报告新的值:
这种情况中,系统会调用onSensorChanged()方法,它提供了一个SensorEvent对象。SensorEvent对象包含了有关新的传感器数据的信息,包括:数据的精度、产生数据的传感器、产生数据时的时间戳、以及传感器记录的新的数据。
package com.senmar;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener {
private TextView tvSensors,tvSensors1,tvSensors2;
private SensorManager sensorManager;
private float[] gravity = new float[3];//保存重力传感器数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//显示数据控件
tvSensors = (TextView) findViewById(R.id.tvSensors);
tvSensors1 = (TextView) findViewById(R.id.tvSensors1);
tvSensors2 = (TextView) findViewById(R.id.tvSensors2);
// 获取传感器服务
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
// 当传感器的精度发生改变时调用此方法
}
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:// 加速度传感器
// 消杂:消除重力对回传值的影响
final float alpha = (float) 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
String accelerometer = "加速度\n" + "X:"
+ (event.values[0] - gravity[0]) + "\nY:"
+ (event.values[1] - gravity[1]) + "\nZ:"
+ (event.values[2] - gravity[2]);
tvSensors.setText(accelerometer);
break;
case Sensor.TYPE_GRAVITY:// 重力传感器
// 获取返回值
gravity[0] = event.values[0];
gravity[1] = event.values[1];
gravity[2] = event.values[2];
break;
case Sensor.TYPE_PROXIMITY:// 临近传感器
// 显示在标题
tvSensors1.setText("临近\n"+String.valueOf((event.values[0])));
break;
case Sensor.TYPE_LIGHT:// 临近传感器
// 显示在标题
tvSensors2.setText("光照\n"+String.valueOf(event.values[0]));
break;
default:
break;
}
}
//生命周期函数
@Override
protected void onResume() {
super.onResume();
// 注册监听传感器
// 加速度
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
// 重力
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_FASTEST);
// 临近传感器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
SensorManager.SENSOR_DELAY_UI);
// 光照传感器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_UI);
}
//生命周期函数
@Override
protected void onPause() {
super.onPause();
// 取消传感器监听
sensorManager.unregisterListener(this);
}
}