Android Sensors (2) 传感器API的使用

 

识别传感器和传感器能力

  Android sensor framework提供了一些方法,使得你在运行时可以方便地查看设备上都有哪些传感器。

  API也提供了一些让你获取每个传感器性能的方法。

  首先,你需要获取sensor service的一个引用;即通过向 getSystemService()方法中传入SENSOR_SERVICE 参数来创建一个SensorManager类的实例。

private SensorManager mSensorManager;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

 

  然后,你可以通过在getSensorList() 方法中传入TYPE_ALL 来获取设备上的所有传感器。

List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

 

  如果你想要获取指定类型的一系列传感器,你可以使用参数TYPE_GYROSCOPETYPE_LINEAR_ACCELERATIONTYPE_GRAVITY等。

  如果对于某种特定类型的传感器来说,设备上含有不止一个这种传感器,那么这些传感器中的一个将被指定为这种类型的默认传感器

  使用getDefaultSensor()方法并且传入特定的传感器类型,可以得到此类型的默认传感器

  如果此类型的默认传感器不存在,那么这个方法将会返回null,这就意味着这个设备不含此类型的传感器

  除了列出设备上的传感器,你可以利用Sensor 类中的方法去获得传感器的性能及属性。当你需要你的应用在不同的设备环境下有不同的行为时,这样做是很有用的。

 

监测传感器事件

  为了检测传感器数据,你需要实现SensorEventListener 接口中的两个回调方法:onAccuracyChanged()和 onSensorChanged()

 

当传感器的精度改变时:

  系统调用 onAccuracyChanged() 方法,为你提供Sensor对象的引用和新的精度值。

  精度值一般由下面四个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE

 

当传感器报告一个新的值时:

  系统调用onSensorChanged() 方法,为你提供一个SensorEvent对象。

 

一个检测传感器事件的例子

  如下面这个例子:

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mLight;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    // 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 microseconds)对于监控屏幕方向改变比较合适;其他的:

   SENSOR_DELAY_GAME (20,000 microsecond delay), SENSOR_DELAY_UI (60,000 microsecond delay), 

   SENSOR_DELAY_FASTEST (0 microsecond delay),另外Android 3.0 (API Level 11)可以使用绝对值来设置数据延迟(单位是毫秒)。

  你设定的延迟只是一个建议性的延迟,Android系统或其他应用可以改变这个延迟。

  最好的实践经验是,你指定可用的最大延迟,因为系统通常是用一个比你指定的值小一些的值。

  这即是说,你需要指定满足你应用需求的最低的采样率。用比较大的延迟可以使处理器负载较轻,从而消耗更少的能量。

  没有指定sensor framework向应用发送sensor event频率的public的方法,但是,你可以利用每一个sensor event的时间戳去计算几个事件的采样率。

  一旦设定后,你不必改变采样率;如果因为某种理由你必须改变采样率,你必须注销(unregister然后重新注册(reregister这个sensor listener。

 

注册和注销位置

  这个例子中使用了 onResume() 和onPause() 回调函数来注册和注销传感器事件监听器。

  最佳实践:当你不需要传感器时你应该关闭它,特别是你的activity暂停的时候。

  如果不这么做你的电池会很快消耗完,系统不会在屏幕关闭的时候自动关闭传感器。

 

 

参考资料

  API Guides:Sensors Overview

  http://developer.android.com/guide/topics/sensors/sensors_overview.html

posted @ 2013-03-12 01:33  圣骑士wind  阅读(5294)  评论(0编辑  收藏  举报