2013年7月24日 星期三

Android常用傳感器

在上文中介紹了加速度傳感器,並以真機和模擬器兩種方式進行了測試。在本文中將介紹其餘幾種傳感器,它們的處理方式完全一樣。這裡就只用真機進行測試了。
1、方向傳感器:返回三個角度
第一個角度:表示手機頂部朝向與正北方的夾角。範圍0~360
第二個角度:表示手機頂部或尾部翹起的角度。範圍-180~180
第三個角度:表示手機左側或右側翹起的角度。範圍-90~90
2、磁場傳感器:返回三個數據,分別代表周圍磁場分解到X、Y、Z三個方向上的分量。
3、溫度傳感器:返回一個數據,表示手機設備周圍溫度。
4、光傳感器:返回一個數據,表示手機設備周圍的光的強度。
5、壓力傳感器:返回一個數據,表示手機設備周圍的壓力大小。
下面用一個簡單示例來演示它們的使用,代碼如下:
Activity:
  1. package  com.home.sensor;  
  2.   
  3. import  android.hardware.Sensor;  
  4. import  android.hardware.SensorEvent;  
  5. import  android.hardware.SensorEventListener;  
  6. import  android.hardware.SensorManager;  
  7. import  android.os.Bundle;  
  8. import  android.widget.EditText;  
  9. import  android.app.Activity;  
  10.   
  11. public  class  SensorTestActivity  extends  Activity  implements  SensorEventListener {  
  12.     // 定義真機的傳感器管理器  
  13.     private  SensorManager mSensorManager;  
  14.     private  EditText orientation;  
  15.     private  EditText magnetic;  
  16.     private  EditText temerature;  
  17.     private  EditText light;  
  18.     private  EditText pressure;  
  19.   
  20.     @Override  
  21.     protected  void  onCreate(Bundle savedInstanceState) {  
  22.         super .onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.         // 獲取界面上的EditText組件  
  25.         orientation = (EditText) findViewById(R.id.main_et_orientation);  
  26.         magnetic = (EditText) findViewById(R.id.main_et_magnetic);  
  27.         temerature = (EditText) findViewById(R.id.main_et_temerature);  
  28.         light = (EditText) findViewById(R.id.main_et_light);  
  29.         pressure = (EditText) findViewById(R.id.main_et_pressure);  
  30.         // 獲取真機的傳感器管理服務  
  31.         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  32.     }  
  33.   
  34.     @Override  
  35.     protected  void  onResume() {  
  36.         super .onResume();  
  37.         // 為系統的方向傳感器註冊監聽器  
  38.         mSensorManager.registerListener( this ,  
  39.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),  
  40.                 SensorManager.SENSOR_DELAY_GAME);  
  41.         // 為系統的磁場傳感器註冊監聽器  
  42.         mSensorManager.registerListener( this ,  
  43.                 mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),  
  44.                 SensorManager.SENSOR_DELAY_GAME);  
  45.         // 為系統的溫度傳感器註冊監聽器  
  46.         mSensorManager.registerListener( this ,  
  47.                 mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE),  
  48.                 SensorManager.SENSOR_DELAY_GAME);  
  49.         // 為系統的光傳感器註冊監聽器  
  50.         mSensorManager.registerListener( this ,  
  51.                 mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),  
  52.                 SensorManager.SENSOR_DELAY_GAME);  
  53.         // 為系統的壓力傳感器註冊監聽器  
  54.         mSensorManager.registerListener( this ,  
  55.                 mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),  
  56.                 SensorManager.SENSOR_DELAY_GAME);  
  57.     }  
  58.   
  59.     @Override  
  60.     protected  void  onPause() {  
  61.         super .onPause();  
  62.         // 程序暫停時取消註冊傳感器監聽器  
  63.         mSensorManager.unregisterListener( this );  
  64.     }  
  65.   
  66.     @Override  
  67.     public  void  onAccuracyChanged(Sensor sensor,  int  accuracy) {  
  68.     }  
  69.   
  70.     @Override  
  71.     public  void  onSensorChanged(SensorEvent event) {  
  72.         float [] values ​​= event.values;  
  73.         StringBuffer sb =  null ;  
  74.         switch  (event.sensor.getType()) {  
  75.         // 方向傳感器  
  76.         case  Sensor.TYPE_ORIENTATION:  
  77.             sb =  new  StringBuffer();  
  78.             sb.append( "繞Z軸轉過的角度:"  + values[ ]);  
  79.             sb.append( "\n繞X軸轉過的角度:"  + values[ ]);  
  80.             sb.append( "\n繞Y軸轉過的角度:"  + values[ ]);  
  81.             orientation.setText(sb.toString());  
  82.             break ;  
  83.         // 磁場傳感器  
  84.         case  Sensor.TYPE_MAGNETIC_FIELD:  
  85.             sb =  new  StringBuffer();  
  86.             sb.append( "X方向上的磁場分量:"  + values[ ]);  
  87.             sb.append( "\nY方向上的磁場分量:"  + values[ ]);  
  88.             sb.append( "\nZ方向上的磁場分量:"  + values[ ]);  
  89.             magnetic.setText(sb.toString());  
  90.             break ;  
  91.         // 溫度傳感器  
  92.         case  Sensor.TYPE_TEMPERATURE:  
  93.             sb =  new  StringBuffer();  
  94.             sb.append( "當前溫度為:"  + values[ ]);  
  95.             temerature.setText(sb.toString());  
  96.             break ;  
  97.         // 光傳感器  
  98.         case  Sensor.TYPE_LIGHT:  
  99.             sb =  new  StringBuffer();  
  100.             sb.append( "當前光的強度:"  + values[ ]);  
  101.             light.setText(sb.toString());  
  102.             break ;  
  103.         // 壓力傳感器  
  104.         case  Sensor.TYPE_PRESSURE:  
  105.             sb =  new  StringBuffer();  
  106.             sb.append( "當前壓力為:"  + values[ ]);  
  107.             pressure.setText(sb.toString());  
  108.             break ;  
  109.         }  
  110.     }  
  111. }  
佈局XML:
  1. LinearLayout  xmlns:android "http://schemas.android.com/apk/res/android"  
  2.     android:layout_width "match_parent"  
  3.     android:layout_height "match_parent"  
  4.     android:orientation "vertical"  >  
  5.   
  6.     EditText  
  7.         android:id "@+id/main_et_orientation"  
  8.         android:layout_width "match_parent"  
  9.         android:layout_height "wrap_content"  
  10.         android:editable "false"  />  
  11.   
  12.     EditText  
  13.         android:id "@+id/main_et_magnetic"  
  14.         android:layout_width "match_parent"  
  15.         android:layout_height "wrap_content"  
  16.         android:editable "false"  />  
  17.   
  18.     EditText  
  19.         android:id "@+id/main_et_temerature"  
  20.         android:layout_width "match_parent"  
  21.         android:layout_height "wrap_content"  
  22.         android:editable "false"  />  
  23.   
  24.     EditText  
  25.         android:id "@+id/main_et_light"  
  26.         android:layout_width "match_parent"  
  27.         android:layout_height "wrap_content"  
  28.         android:editable "false"  />  
  29.   
  30.     EditText  
  31.         android:id "@+id/main_et_pressure"  
  32.         android:layout_width "match_parent"  
  33.         android:layout_height "wrap_content"  
  34.         android:editable "false"  />  
  35.   
  36. </ LinearLayout >