Android传感器的运用之ACCELEROMETER


Android中支持很多种传感器:
比如加速度,重力的,光感,磁感等等。
在运用该API常用到的两个类和一个接口
SensorManager:传感器管理类;
Sensor:一个描述传感器的类;
SensorEventListener:传感器事件监听类(SensorListener类已过期);
一般运用步骤:

1.通过上下文获取SensorManager的对象。

[java]
  1. Context.getSystemService(Context.Sensor_service);  
2.实例化一个你需要使用的sensor对象。

[java]
  1. Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
也可以通过getSensorList()来获取所有的传感器对象,返回一个list;
3.实现传感器监听接口
4.注册传感器
5.反注册传感器
代码例子都很简单简短。
以下附上我以前用到的一个关于加速度的传感器,我用来做摇晃事件监听;

[java]
  1. /** 
  2.  * 摇动检测器 
  3.  * @author Nono 
  4.  * 
  5.  */  
  6. public class ShakeDetector implements SensorEventListener{  
  7.     private static final String TAG = ShakeDetector.class.getSimpleName();  
  8.       
  9.      private static final double SHAKE_SHRESHOLD = 7000d;  
  10.       private Context mContext;  
  11.       private long lastTime ;  
  12.       private float last_x;  
  13.       private float last_y;  
  14.       private float last_z;  
  15.       
  16.       private SensorManager sensorManager;  
  17.       private onShakeListener shakeListener;  
  18.       /** 
  19.        * 构造 
  20.        * @param context 
  21.        */  
  22.       public ShakeDetector(Context context){  
  23.           mContext = context;  
  24.           sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  
  25.       }  
  26.         
  27.     /** 
  28.      * 注册传感器 
  29.      */  
  30.     public boolean registerListener() {  
  31.           
  32.         if (sensorManager != null) {  
  33.             Sensor sensor = sensorManager  
  34.                     .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
  35.             if (sensor != null) {  
  36.                 this.sensorManager.registerListener(this, sensor,  
  37.                         SensorManager.SENSOR_DELAY_GAME);  
  38.                 LogUtil.log(TAG, "registerListener: succeed!!");  
  39.                 return true;  
  40.             }  
  41.         }  
  42.         return false;  
  43.     }  
  44.         
  45.     /** 
  46.      * 反注册传感器 
  47.      */  
  48.     public void unRegisterListener() {  
  49.         if (sensorManager != null)  
  50.             sensorManager.unregisterListener(this);  
  51.     }  
  52.       
  53.     public void setOnShakeListener(onShakeListener listener){  
  54.         shakeListener = listener;  
  55.     }  
  56.   
  57.     public void onSensorChanged(SensorEvent event) {  
  58.         //if (event.sensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {   
  59.             long curTime = java.lang.System.currentTimeMillis();  
  60.             if ((curTime - lastTime) > 10) {  
  61.                 long diffTime = (curTime - lastTime);  
  62.                 lastTime = curTime;  
  63.                 float x = event.values[0];  
  64.                 float   y = event.values[1];  
  65.                 float z = event.values[2];  
  66.                 float speed = Math.abs(x + y + z - last_x - last_y - last_z)  
  67.                         / diffTime * 10000;  
  68.                 if (speed > SHAKE_SHRESHOLD) {  
  69.                     // 检测到摇晃后执行的代码   
  70.                     shakeListener.onShake();  
  71.                 }  
  72.                 last_x = x;  
  73.                 last_y = y;  
  74.                 last_z = z;  
  75.             }  
  76.         //}   
  77.     }  
  78.   
  79.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  80.         // TODO Auto-generated method stub   
  81.           
  82.     }  
  83.       
  84.     /** 
  85.      *  
  86.      * @author Nono 
  87.      * 
  88.      */  
  89.     public interface onShakeListener{  
  90.         public void onShake();  
  91.     }  
  92.   
  93. }  
上面是自己实现的一个关于加速度的传感器类
在Activity中实例化该类,并实现onShakeListener接口

[java]
  1. @Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  
  4.         super.onCreate(savedInstanceState);  
  5.         mContext = this;  
  6.         mShakeDetector = new ShakeDetector(mContext);  
  7.         mShakeDetector.setOnShakeListener(this);  
然后你可以在Activity的几个生命周期中实现它的注册和反注册。
在onshakeListener中onShake方法中做传感器检测到变动的事件处理。

相关内容