目前Android手机基本带有的传感器有:
1,加速度传感器: accelerometer
Sensor.TYPE_ACCELEROMETER
2, 电磁场(磁力)传感器:
Sensor.TYPE_MAGNETIC_FIELD
3,方向传感器: orientation (Sensor.TYPE_ORIENTATION)
4, 光线传感器: light (Sensor.TYPE_LIGHT)
5,距离传感器 proximity
Sensor.TYPE_PROXIMITY
6, 陀螺仪传感器 gyroscope
Sensor.TYPE_GYROSCOPE
7,重力传感器
等.
我们可以通过Android提供给我们的传感器管理器(SensorManager)来管理这些。
SensorManagersm = (SensorManager) getSystemService(SENSOR_SERVICE); 获取系统传感器管理器。
然后通过此管理器获取并管理我们的传感器。
获取 某个类型的默认传感器:
Sensor sensor = getDefaultSensor(Sensor.TYPE_LIGHT);//光线传感器
// 注册监听,获取传感器的变化值
.registerListener(sensorLightListener,lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
第一个参数:对传感器系统的监听,数据的改变等。实现
event获取
第二个参数是,传感器类别,即:监听的传感器。
第三个参数,采样率。分为:最快,游戏,普通,用户界面。
当应用程序请求特定的采样率时,其实就是对传感器子系统的一个建议,不保证特定的采样率可用。
最快: SensorManager.SENSOR_DELAY_FASTEST ,此采样率延迟最低,敏感度很高,但是造成的手机电池消耗很大,再加上获取的数据为原始数据,算法不处理好将会影响游戏逻辑和UI的性能。不特别敏感的处理,不推荐使用。
游戏:SensorManager.SENSOR_DELAY_GAME ,一般绝大多数实时性较高的游戏使用次级别。
普通:SensorManager.SENSOR_DELAY_NORMAL;比较标准的延迟,一般益智类或容易级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。
用户界面: SensorManager.SENSOR_DELAY_UI 一般对于屏幕方向的自动旋转使用,相对节能和逻辑处理,游戏开发中不建议使用。
accuracy的值,也就是那四个常量相应的整数:
SENSOR_DELAY_NORMAL:3
SENSOR_DELAY_UI:2
SENSOR_DELAY_GAME:1
SENSOR_DELAY_FASTEST.:0
使用传感器做应用的难点在于 获取数据后,如何处理数据获取响应的所需效果,这里就涉及到了很多数学物理知识。
下面一个关于光线传感器的一个小例子。
public class LightSensorActivityextends Activity implements
private TextViewcontent;
private SensorManagersm;
private SensorlightSensor;
@Override
protectedvoid
// TODO
super.onCreate(savedInstanceState);
setContentView(R.layout.light_sensor);
content = (TextView) findViewById(R.id.content);
//获得传感器管理器实例
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
protectedvoid
super.onResume();
//获得光线传感器实例
lightSensor =sm.getDefaultSensor(Sensor.TYPE_LIGHT);
if (lightSensor ==null) {
content.setText("无此类传感器");
} else
//为传感器管理器注册监听
sm.registerListener(this,lightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
protectedvoid
// TODO
super.onPause();
注销监听
sm.unregisterListener(this);
}
@Override
public void
//将values的值显示到屏幕上
content.setText(event.values[0]+"'");
}
@Override
public void onAccuracyChanged(Sensor sensor, int
// TODO
Toast.makeText(this,"accuracy = "+accuracy, Toast.LENGTH_SHORT).show();
}
}