传感器概述

基于Android的设备有内置的传感器,用于测量运动,方向,和各种环境条件。这些传感器能够提供原始数据并保证其精确度和高准确度。比如,一个天气应用程序可能使用设备的温度传感器和湿度传感器来计算和报告环境状态。同样,一个健康应用会通过计步传感器和心率传感器测量消耗的卡路里和当前的心率值。 IWOP平台支持的传感器分为三大类:

 
运动传感器:
 
这些传感器用于测量当前身体或手臂的运动状态。这类传感器包括运动传感器,手势传感器和计步传感器。
 
健康传感器:
 
这些传感器用于测量身体的健康状态,目前只支持心率传感器。
 
环境传感器:
 
这些传感器用于测量各种环境参数,如空气温度、压力和湿度,光照。 这一类包括气压计,湿度计,温度计。

你可以访问设备上所有可用的传感器,利用IWOP传感器服务获取传感器原始数据。传感器服务提供了一些类和接口,帮助你执行各种各样的传感器相关的任务。例如,你可以使用的传感器服务进行如下操作:

  • 确定设备上存在某种传感器。
  • 监听传感器的变化。

传感器介绍

传感器支持列表

IWOP传感服务目前支持以下传感器:

 
TYPE_HEART_RATE:
 
心率传感器,测量心率。
 
TYPE_GESTURE:
 
手势传感器,测量当前手的状态(抬手/摇手等)。
 
TYPE_MOTION:
 
运动传感器,测量身体运动姿态(跑步/骑行等)。
 
TYPE_STEP_COUNTER:
 
计步传感器,测量步数。
 
TYPE_RELATIVE_HUMIDITY:
 
环境湿度传感器,测量环境湿度。
 
TYPE_AMBIENT_TEMPERATURE:
 
环境温度传感器,测量环境温度。
 
TYPE_PRESSURE:
 
气压传感器,测量环境大气压。

传感服务框架

你可以访问以上的传感器通过IWOP传感服务框架,服务在com.ingenic.iwds.smartsense包中,其中包含了以下的类和接口:

 
SensorServiceManager:
 
你可以使用这个类获取不同类型传感器的实例。这个类提供了访问传感器的方法,注册和注销传感器事件监听器。这个类还提供了手势和运动传感器的常量,用于对比对应传感器上报的数据。
 
Sensor:
 
传感器的实例,这个类提供了一些方法可以用来确定传感器的信息。
 
SensorEvent:
 
服务使用这个类创建一个传感器的事件对象,它提供了一个传感器的数据,类型,数据的准确性。
 
SensorEventListener:
 
传感器事件监听器,可以监听两种事件,传感器数值变化和传感器精度变化。

访问系统传感器

IWOP传感器服务框架可以让你很容易的在运行时获取设备传感器以及所支持的传感器列表。 为了访问传感器首先需要连接传感器服务。你需要先实例化ServiceClient并传递SERVICE_SENSOR作为参数。例如:


private ServiceClient mClient = new ServiceClient(this,ServiceManagerContext.SREVICE_SENSOR); 
...
mClient.connect();

然后,在服务连接之后你可以获取传感器以及传感器列表:


private SensorServiceManager mService;
...
public void onConnected() {
    mService = (SensorServiceManager) mClient.getServiceManagerContext();
    List mService.getSensorList();
}

你也可以获取指定类型的传感器:


private SensorServiceManager mService;
private Sensor mSensor;
...
public void onConnected() {
    mService = (SensorServiceManager) mClient.getServiceManagerContext();
    mSensor = mService.getDefaultSensor(Sensor.TYPE_HEART_RATE);
    if (mSensor != null) {
        // Success! There's a heart rate sensor.
    } else {
        // Failure! No heart rate sensor.
    }
}

监听传感器事件

为了监听传感器数据你需要SersorEventListener监听器中的事件两个回调方法:onSensorChanged()和onAccuracyChanged()。传感器服务将会回调这两个方法当:

 
传感器精度变化:
 
这种情况下将调用onAccuracyChanged()方法,现在只支持心率传感器的精度变化处理。
 
目前心率传感器的上报精度值有两种,分别为ACCURACY_HEART_RATE_UNAVALIABLE和ACCURACY_HEART_RATE_AVALIABLE。 这两种分别描述了心率传感器的工作状态。
 
当上报精度为ACCURACY_HEART_RATE_UNAVALIABLE时,表示心率传感器工作状态不正常,有可能是心率没有正常接触人体皮肤,或者手表佩戴不适导致测量心率超时。当上报精度为ACCURACY_HEART_RATE_AVALIABLE时,表示心率传感器工作状态正常,手表佩戴良好,心率测量数据即将上报(通常会在1~5s内上报心率数据)。
 
传感器数据变化:
 
这种情况下将调用onSensorChanged()方法,SensorEvent作为参数传进来,SensorEvent包含了新传感器数据以及事件产生时的时间戳。

以下是典型用法:


public class SensorActivity implements ConnectionCallbacks,
        SensorEventListener {
    private SensorServiceManager mService;
    private ServiceClient mClient;
    private Sensor mSensor;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mClient = new ServiceClient(this,
                ServiceManagerContext.SERVICE_SENSOR, this);
    }

    @Override
    public void onConnected() {
        mService = (SensorServiceManager) mClient.getServiceManagerContext();
        mSensor = mService.getDefaultSensor(Sensor.TYPE_HEART_RATE);
        mService.registerListener(this, mSensor,
                SensorServiceManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    public void onDisconnected(boolean unexpected) {
        mService.unregisterListener(mListener, mSensor);
    }

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

    @Override
    public final void onSensorChanged(SensorEvent event) {
        float heartRate = event.values[0];
        // Do something with this sensor value.
    }

    @Override
    protected void onResume() {
        super.onResume();
        mClient.connect();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mClient.disconnect();
    }
}

以上示例中使用了SensorServiceManager.SENSOR_DELAY_NORMAL作为参数用来注册传感器事件监听器,但目前传感服务不支持事件延迟指定。示例中在onResume()和onPause中连接/断开传感服务,这样在你不需要使用传感器时及时注销监听器关闭传感器可以节省设备电量。