监视传感器事件
要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()和onSensorChanged()。Android系统在任何发生下列事情的时候都会调用这两个方法:
1. 传感器精度的改变:
这种情况中,系统会调用onAccuracyChanged()方法,它提供了你要引用的发生精度变化的Sensor对象。精度使用以下四个状态常量之一来代表的:
SENSOR_STATUS_ACCURACY_LOW
SENSOR_STATUS_ACCURACY_MEDIUM
SENSOR_STATUS_ACCURACY_HIGH
SENSOR_STATUS_UNRELIABLE
2. 传感器报告新的值:
这种情况中,系统会调用onSensorChanged()方法,它提供了一个SensorEvent对象。SensorEvent对象包含了有关新的传感器数据的信息,包括:数据的精度、产生数据的传感器、产生数据时的时间戳、以及传感器记录的新的数据。
下列代码显示了如何使用onSensorChanged()方法来监视来自亮度传感器的数据。这个例子在一个TextView中显示原始的传感器数据:
publicclassSensorActivityextendsActivityimplementsSensorEventListener{
privateSensorManager mSensorManager;
privateSensor mLight;
@Override
publicfinalvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
publicfinalvoid onAccuracyChanged(Sensor sensor,int accuracy){
// Do something here if sensor accuracy changes.
}
@Override
publicfinalvoid onSensorChanged(SensorEventevent){
// The light sensor returns a single value.
// Many sensors return 3 values, one for each axis.
float lux =event.values[0];
// Do something with this sensor value.
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
在这个例子中,在调用registerListener()方法时,指定了默认的数据延迟(SENSOR_DELAY_NORMAL)。数据延迟(或采样率)控制着传感器事件通过onSensorChanged()回调方法发送给你的应用程序的时间间隔。默认的数据延迟适用于监视典型的屏幕方向的变化,它所使用的时间延迟是200,000毫秒。你能够指定其他的数据延迟类型,如SENSOR_DELAY_GAME(20,000毫秒延迟)、SENSOR_DELAY_UI(60,000毫秒延迟)、或者是SENSOR_DELAY_FASTEST(0毫秒延迟)。Android3.0(API Level 11)以后,你也能够使用一个绝对值(以毫秒的形式)来指定延迟。
你所指定的延迟只是建议性的延迟。Android系统和其他应用程序都能够修改这个延迟。作为最好的实践,你应该指定你所需要的最大延迟,因为系统通常会使用比你指定的要小的延迟(也就是说,你应该选择你的应用所需要的最低的采样率)。使用较大的延迟会降低处理器的负载,同时也因此降低了电量的损耗。
有没有公开的方法用于判断传感器框架把传感器事件发送给你的应用程序的频率;但是,你能够使用前后两个传感器事件的时间戳来计算采样率。一旦你设置了采样率(延迟)就不要改变。如果因为某些原因需要改变,那么就必须先注销然后在重新注册传感器监听器。
在这个例子中还要重点关注的是:使用onResume()和onPause()回调方法来注册和注销传感器监听事件。作为最好的实践,你始终应该在不需要的时候禁用传感器,尤其是在Activity被挂起的时候。如果不这样做,因为有些传感器有很大的电量需求,因此会很快的消耗掉电池电量。在屏幕关闭的时候,系统不会自动的禁用传感器。