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_GYROSCOPE,TYPE_LINEAR_ACCELERATION或TYPE_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)。
网友评论