android传感器

2016-09-19  本文已影响402人  MrMagicWang
android传感器的种类
Sensor framework

使用Android的sensor framework,可以访问设备上可用的传感器,获取传感器原始数据。比如:

1.查看设备上可用的传感器。
2.查看某一个传感器的性能,比如它的量程、分辨率、能量要求等。
3.获取测量数据,并且设置刷新频率。
4.注册和注销传感器事件监听器。

Sensor framework是android.hardware这个包的一部分,包含下面一些重要的类:SensorManager, Sensor, SensorEvent, SensorEventListener

识别传感器

Android sensor framework提供了一些方法,使得在运行时可以方便地查看设备上都有哪些传感器。
首先,需要获取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()方法并且传入特定的传感器类型,可以得到此类型的默认传感器。

使用传感器之前需要检测相应的传感器是否存在,因为并不是没台设备都包含想要使用的传感器

Sensor mSensor = mManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
if (mSensor == null){
      //传感器不存在
}

还可以通过Android Market过滤器来限定目标设备必须带有指定的传感器

 <uses-feature
     android:name="android.hardware.sensor.orientation"
     android:required="true">
 </uses-feature>
监听传感器事件

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

private SensorEventListener listener = new SensorEventListener() {
    /**
     * 传感器事件值改变回调
     */
    @Override
    public void onSensorChanged(SensorEvent event) {
        //判断传感器
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
            //读取传感器测量值  
            float angularX = event.values[0];
        }
    }
    /**
     * 传感器精度发生改变时候的回调
     */
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
};
注册和注销传感器监听

通过registerListener方法注册传感器监听

  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(listener, mLight, SensorManager.SENSOR_DELAY_NORMAL);
  }

通过unregisterListener方法注销传感器监听

  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(listener);
  }

注:当不需要传感器时你应该关闭它,特别是activity暂停的时候。如果不这么做你的电池会很快消耗完,系统不会在屏幕关闭的时候自动关闭传感器。

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 listener。

传感器坐标系统

通常,sensor framework使用一个标准的三轴坐标系统来表达数值。

对于大多数传感器来说,坐标系统是相对于设备屏幕来说的。

当一个设备被放在其默认的方向上时,X轴是水平指向右的,Y轴是垂直向上的,Z轴是指向屏幕正面之外的,即屏幕背面是Z的负值。


在屏幕方向改变的时候,坐标系中的轴是不会交换的。

不能假设设备的自然(默认)方向是竖直的(portrait),自然方向对于很多的平板设备来说是横向的(landscape)。

坐标系永远是基于设备的自然方向的。

上一篇下一篇

猜你喜欢

热点阅读