1. 概述
Android Sensor Framework 提供了标准的class 和interface 来访问和控制各种sensor。目前android 默认支持的sensor种类如下:
public static final int TYPE_ACCELEROMETER = 1;
public static final int TYPE_MAGNETIC_FIELD = 2;
public static final int TYPE_ORIENTATION = 3;
public static final int TYPE_GYROSCOPE = 4;
public static final int TYPE_LIGHT = 5;
public static final int TYPE_PRESSURE = 6;
public static final int TYPE_PROXIMITY = 8;
public static final int TYPE_GRAVITY = 9;
public static final int TYPE_LINEAR_ACCELERATION = 10;
public static final int TYPE_ROTATION_VECTOR = 11;
public static final int TYPE_RELATIVE_HUMIDITY = 12;
public static final int TYPE_AMBIENT_TEMPERATURE = 13;
public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14;
public static final int TYPE_GAME_ROTATION_VECTOR = 15;
public static final int TYPE_GYROSCOPE_UNCALIBRATED = 16;
public static final int TYPE_SIGNIFICANT_MOTION = 17;
public static final int TYPE_STEP_DETECTOR = 18;
public static final int TYPE_STEP_COUNTER = 19;
public static final int TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20;
public static final int TYPE_HEART_RATE = 21;
public static final int TYPE_TILT_DETECTOR = 22;
public static final int TYPE_WAKE_GESTURE = 23;
public static final int TYPE_GLANCE_GESTURE = 24;
public static final int TYPE_PICK_UP_GESTURE = 25;
public static final int TYPE_PEDOMETER = 26;
public static final int TYPE_IN_POCKET = 27;
public static final int TYPE_ACTIVITY = 28;
public static final int TYPE_FACE_DOWN = 29;
public static final int TYPE_SHAKE = 30;
后续AmLink平台会在此基础上支持更多的sensor种类。
2. Sensor Framework and API
public abstract class SensorManager
是个抽象类,提供各种方法来访问和监听sensor,通过调用getSystemService(SENSOR_SERVICE)可以获取该类的一个实例。重要的方法api如下:
/*注册listener来监听sensor事件,rate参数表示采样间隔*/
public boolean registerListener(SensorListener listener, int sensors, int rate)
/*获取指定类型的sensor*/
public Sensor getDefaultSensor(int type)
public final class Sensor
用于创建具体sensor的实例,它提供了各种方法api类获取设备sensor的详细信息。常用的如下:
/*获取sensor分辨率*/
float getResolution ()
/*获取sensor最大量程*/
float getMaximumRange ()
/*获取sensor vendor信息*/
String getVendor ()
/*获取sensor 工作时的功耗*/
float getPower ()
public class SensorEvent
该类定义了传感器事件类型,主要成员如下:
public final float[] values; /*传感器的值*/
public Sensor sensor; /* 产生本次事件的sensor */
public int accuracy; /*精确度*/
public long timestamp; /*时间戳*/
public interface SensorEventListener
是个interface, 当sensor数据更新时,用于接收来自SensorManager的通知,主要方法如下:
/*sensor数据改变时该函数被回调,参数event保存了sensor 事件信息*/
public void onSensorChanged(SensorEvent event);
/*sensor 精确度改变时该函数被回调*/
public void onAccuracyChanged(Sensor sensor, int accuracy);
3. 参考代码
下面是获取光传感器的数据的参考代码:
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);
}
}
4. 参考
更多的资料请参考:
https://developer.android.com/reference/android/hardware/Sensor.html