歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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方法中做傳感器檢測到變動的事件處理。
Copyright © Linux教程網 All Rights Reserved