一、传感器的使用。

  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());
 

 
 }
 

 
}