一般情况下,传感器数据采样率不需要太高,采样速度过快,对设备耗电有一定影响。
1.传感器类型
SENSOR_TYPE_ACCELEROMETER 1 //加速度 SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 SENSOR_TYPE_ORIENTATION 3 //方向 SENSOR_TYPE_GYROSCOPE 4 //陀螺仪 SENSOR_TYPE_LIGHT 5 ///光感应 SENSOR_TYPE_PRESSURE 6 //压力 SENSOR_TYPE_TEMPERATURE 7 //温度 SENSOR_TYPE_PROXIMITY 8 //接近 SENSOR_TYPE_GRAVITY 9 //重力 SENSOR_TYPE_LINEAR_ACCELERATION 10///线性加速度 SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量
2.SensorManager提供的采样率
在SensorManager该类提供了以下四种采样频率:
SENSOR_DELAY_NOMAL (200000微秒) 200ms SENSOR_DELAY_UI (60000微秒) 60ms SENSOR_DELAY_GAME (20000微秒) 20ms SENSOR_DELAY_FASTEST (0微秒) 0ms
3.获取指定数量的采样数据
虽然在SensorManager它提供了几种采样率,也可以自定义时间来控制采样率。例如,1秒内使用6次 加速传感器的数据。
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,167000);
但由于采样数据不是平均出来的,经过测试,发现某一秒只能采用5次数据。不符合实际需要。 因此,采用另一种方式,即提高采样率约为每秒10次,然后定期在线取数据,具体实现代码片段如下。
mAccThread = new HandlerThread("ACCELEROMETER_THREAD"); mAccThread.start(); mAccHandler = new Handler(mAccThread.getooper(), accCallback);
*注册加速度传感器监听*
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mSensorEventListener,accelerometerSensor,100000);
*数据回调*
SensorEventListener mSensorEventListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
float x = Math.abs(event.values[0]);
float y = Math.abs(event.values[1]);
float z = Math.abs(event.values[2]);
sendDataMessage(x, y, z);
}
}
};
*传输数据*
private void sendDataMessage(float x, float y, float z) {
Message msg = mAccHandler.obtainMessage();
msg.what = MSG_ASENSOR;
Bundle bundle = new Bundle();
bundle.putFloat("x", x);
bundle.putFloat("y", y);
bundle.putFloat("z", z);
msg.setData(bundle);
mAccHandler.sendMessage(msg);
}
*定时采取数据*
private Handler.Callback accCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case MSG_ASENSOR:
float ax = msg.getData().getFloat("x");
float ay = msg.getData().getFloat("y");
float az = msg.getData().getFloat("z");
break;
}
try {
Thread.sleep(167);
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}};
这样就能够实现需求1秒采取6次传感器数据啦。