一、传感器的使用。
1.传感器使用步骤:
①.调用Context的getSystemService(Context.SERSOR_SERVICE)方法获取SensorManager对象。
②.调用SensorManager对象的getDefaultSensor(int type)方法来获取指定类型的传感器。
③.通常在Activity的onResume()方法中调用SensorManager的registerListener()为传感器注册监听。
2. registerListener(SensorEventListener listener,Sensor sensor,int rate) 的参数说明:
listener :监听传感器事件的监听器。需要实现SensorEventListener接口,并实现以下接口方法:
public void onSensorChanged(SensorEvent event) :当传感器的值发生改变时触发。
public void onAccuracyChanged(Sensor sensor, int accuracy):当传感器的精度发生改变时触发。
sensor :传感器对象。
rate :指定获取传感器数据的频率。支持如下:
①SensorManager.SENSOR_DELAY_FASTEST:最快的频率,延迟最小,耗电量大,适合特别依赖传感器数据的应用。
②SensorManager.SENSOR_DELAY_GAME :适合游戏的频率。适合一般实时性要求的应用。
③SensorManager.SENSOR_DELAY_NORMAL:正常频率。适合实时性要求不是特别高的应用。
④SensorManager.SENSOR_DELAY_UI:最小的频率,延迟较大,耗电量小,系统开销小,适合普通用户界面的频率。
3.常用传感器:
传感器的坐标与屏幕的坐标系统不同,传感器系统的X轴沿屏幕向左,Y轴沿屏幕向上,Z轴垂直于屏幕向里。
的values()方法返回X、Y、Z方向上的加速度。
②方向传感器:
/**
* 需要通过加速度传感器得到三个加速度的值
*/
private float[] aValues = new float[3];
/**
*需要通过磁场传感器得到三个方向的值
*/
private float[] mValues = new float[3];
/**
*SensorManager.getRotationMatrix将值传给R[9]
*/
float [] R=new float [9];
/**
* SensorManager.getOrientation(R, values)将值传给values[3]
*/
float [] values=new float [3];
/**
*R和I是长度为9的float数组,可以为null。
*aValues是长度为3的float数组,值为加速度传感器返回的三个值
*mValues是长度为3的float数组,值为磁场传感器返回的三个值。
* 返回值:成功为true。
*/
boolean flag=SensorManager.getRotationMatrix(R, I, aValues, mValues);
// 将三个方向的值传给values数组
SensorManager.getOrientation(R, values);
//得到的值为弧度,转化为角度
values[0]=(float) Math.toDegrees(values[0]);
values[0]:Z轴角度,表示手机顶部与正北方向的夹角。角度为0时,代表手机顶部朝正北,角度为90,代表朝正东
values[1]:X周角度,表示手机顶部或尾部翘起的角度。范围-180~180。从顶部抬起,角度减少。
values[2]:Y轴角度,表示手机左侧或右侧翘起的角度。范围-90~90。从左侧抬起,角度减少。
Sensor.TYPE_AMBIENT_TEMPERATURE,返回一个值,单位摄氏度。
Sensor.TYPE_LIGHT,返回一个值,单位lux。
⑤压力传感器:type=Sensor.TYPE_PRESSURE,返回一个值。
4.方向传感器的示例:
public class MainActivity extends Activity {
private TextView show;
/**
* 传感器管理对象
*/
private SensorManager sensorManager;
/**
* 监听器对象
*/
private MySensorListener listener;
/**
* 加速度传感器
*/
private Sensor aSensor;
/**
* 磁场传感器
*/
private Sensor mSensor;
/**
* 加速度传感器的值
*/
private float[] aValues = new float[3];
/**
* 磁场度传感器的值
*/
private float[] mValues = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (TextView) findViewById(R.id.tv_show);
// 获取传感器管理者对象
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取加速度传感器
aSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 获取磁场传感器
mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
listener=new MySensorListener();
//注册监听器
sensorManager.registerListener(listener, aSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(listener, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
showText();
}
/**
* 传感器监听器类
*
*/
class MySensorListener implements SensorEventListener {
/**
* 当传感器的值发生改变时触发该方法
*/
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
aValues = event.values;
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mValues = event.values;
break;
}
showText();
}
/**
* 当传感器的精度发生改变时触发该方法
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
@Override
protected void onStop() {
// 取消监听器的注册
if (listener != null) {
sensorManager.unregisterListener(listener, aSensor);
sensorManager.unregisterListener(listener, mSensor);
listener = null;
}
super.onStop();
}
public void showText() {
float [] R=new float [9];
float [] values=new float [3];
// R和I是长度为9的数组,可以为null,aValues是长度为三的数组,值为加度素传感器返回的三个值,mValues是长度为三的数组,值为磁场传感器返回的三个之
boolean flag=SensorManager.getRotationMatrix(R, null, aValues, mValues);
System.out.println(flag);
// 将三个方向的值传给values数组
SensorManager.getOrientation(R, values);
//将弧度转化为角度
values[0]=(float) Math.toDegrees(values[0]);
values[1]=(float) Math.toDegrees(values[1]);
values[2]=(float) Math.toDegrees(values[2]);
StringBuffer sb = new StringBuffer();
sb.append("绕Z轴的角度:" + values[0]);
sb.append("\n绕X轴的角度:" + values[1]);
sb.append("\n绕Y轴的角度:" + values[2]);
show.setText(sb.toString());
}
}