Android手机传感器的使用
1、传感器的分类
- 动作传感器:加速度传感器、重力传感器、陀螺仪等
- 位置传感器:方向传感器、磁力传感器
- 环境传感器:温度传感器、压力传感器、亮度传感器
2、使用传感器的方法
1、获取SensorManager对象
2、执行SensorManager对象的getDefaultSeneor()方法获取Sensor对象
3、获取Sensor对象的各种属性
获取手机所有的传感器名称
SensorManager sensorManager= (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor:sensorList){
Log.i(TAG, "--onClick: "+sensor.getName());
}
//获取指定类型的传感器
Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
String name = lightSensor.getName();
Log.i(TAG, "-----name: "+name);
传感器的采样率
采样率越低越好;
设置传感器原则:尽量使用比较低的传感器采样率,这样就可以使系统负荷最小,同时可以省电。
SENSOR_DELAY_NOMAL(200000微秒)//系统负荷最低,但是传感器反应最慢。
SENSOR_DELAY_UI(60000微秒)
SENSOR_DELAY_GAME(20000微秒)
SENSOR_DELAY_FASTEST(0微秒)//精确度最高
传感器的属性
- 传感器名称:
- 传感器制造商:
- 传感器功率:
- 传感器的resulotion:
lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
String sensorName = event.sensor.getName();
String sensorVendor = event.sensor.getVendor();
float resolution = event.sensor.getResolution();
float power = event.sensor.getPower();
long timestamp = event.timestamp;
Log.i(TAG, "sensorName: "+sensorName);
Log.i(TAG, "sensorVendor: "+sensorVendor);
Log.i(TAG, "resolution: "+resolution);
Log.i(TAG, "power: "+power);
Log.i(TAG, "timestamp: "+timestamp);//时间
int type = event.sensor.getType();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
},lightSensor,SensorManager.SENSOR_DELAY_GAME);
传感器加速度的计算方法
手机三维坐标系统
获取手机加速度的值
加速度值的过滤
private float gravity[]=new float[3];
private float linear_acceleration[]=new float[3];
taoSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
/* float value0 = event.values[0];//x坐标
float value1 = event.values[1];//y坐标
float value2 = event.values[2];//z坐标
Log.i(TAG, "--onSensorChanged: "+value0);
Log.i(TAG, "--onSensorChanged: "+value1);
Log.i(TAG, "--onSensorChanged: "+value2);*/
float alpha=0.8f;
gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0];
gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1];
gravity[2]=alpha*gravity[2]+(1-alpha)*event.values[2];
linear_acceleration[0]=event.values[0]-gravity[0];
linear_acceleration[1]=event.values[1]-gravity[1];
linear_acceleration[2]=event.values[2]-gravity[2];
Log.i(TAG, "----x-加速度---onSensorChanged: "+linear_acceleration[0]);
Log.i(TAG, "----y--加速度---onSensorChanged: "+linear_acceleration[1]);
Log.i(TAG, "----z--加速度---onSensorChanged: "+linear_acceleration[2]);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
},taoSensor,SensorManager.SENSOR_DELAY_NORMAL);
方向传感器的作用
通过方向传感器可以获取设备与地球磁场北极之间的夹角:
1、Azimuth:设备围绕Z轴旋转的角度,y轴与地磁北极之间的夹角,取值范围在0至360度之间;
2、Pitch:设备围绕X轴旋转的角度。当Z轴向y轴的正方向旋转时,该值为正数,反之则为负数,取值范围在-180至180度之间。
3、Roll:设备围绕y轴旋转的角度,当z轴向x轴正方向旋转时,该值为正数,反之则为负数,取值范围在-90至90之间;
距离传感器的作用
判断设备与用户的脑袋之间的距离,实现接口SensorEventListener
sensorManager= (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mProximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
@Override
public void onSensorChanged(SensorEvent event) {
float disatce = event.values[0];
Log.i(TAG, "----disatce---: "+disatce);
Log.i(TAG, "----disatce---: "+mProximity.getMaximumRange());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this,mProximity,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}