Android設備中大多都內置了感測器,這些感測器有些是基於硬體的,有些是基於軟體的。通過感測器,可以監控設備的三維運動、位置,可以推斷用戶的動作,如傾斜、震動、旋轉等,可以監控設備周圍環境的變化等。 在Android平臺中,我們可以通過SensorManager訪問、監聽感測器,並獲取相應...
Android設備中大多都內置了感測器,這些感測器有些是基於硬體的,有些是基於軟體的。通過感測器,可以監控設備的三維運動、位置,可以推斷用戶的動作,如傾斜、震動、旋轉等,可以監控設備周圍環境的變化等。
在Android平臺中,我們可以通過SensorManager訪問、監聽感測器,並獲取相應的信息,同時提供了一些感測器的常量,用於感測器的精確度、獲取速率等。SensorManager中常用的方法有:
1、 Sensor getDefaultSensor(int type):獲取指定類型的預設感測器。
2、 List<Sensor> getSensorList(int type):獲取指定類型的所有感測器,如果要獲取所有感測器,可傳入Sensor.TYPE_ALL。
3、 RegisterListener(SensorEventListener) listensor,Sensor sensor,int rate):為感測器註冊監聽器。
4、 UnregisterListener(SensorEventListener listener,Sensor sensor):註銷感測器的監聽器。
Sensor類代表了感測器,其內部包含了多個常量,用戶指明感測器的類型,並提供了相應方法,用於獲取感測器的各種屬性值。
方法有:
1、 getMaximumRange():最大取值範圍。
2、 getName():設備名稱
3、 getPower():功率
4、 getResolution():精度
5、 getType():感測器類型
6、 getVendor():設備供應商
7、 getVersion():設備版本
SensorEvent該類用於描述感測器事件,封裝了感測器事件的信息。這些信息包括感測器類型、時間、精度和感測器的原始數據等。
SensorEventListener:用於監聽感測器,當感測器的精度或者數據發生變化時,會回調裡面的對應方法。
下麵我們通過如下案例來演示器用法,首先獲取設備中所有的感測器信息,關鍵代碼如下:
public void getSensors(View view){ //獲取手機中的所有感測器 List<Sensor> sensors= mSensorManager.getSensorList(Sensor.TYPE_ALL); StringBuilder sb = new StringBuilder(); for(int i=0;i<sensors.size();i++){ Sensor s = sensors.get(i); sb.append("名稱:").append(s.getName()).append("\n"); sb.append("類型:").append(s.getType()).append(" "); String type="未知感測器"; switch (s.getType()){ case Sensor.TYPE_ACCELEROMETER: type="加速度感測器"; type="TYPE_ACCELEROMETER"; break; case Sensor.TYPE_AMBIENT_TEMPERATURE: type="TYPE_AMBIENT_TEMPERATURE"; break; case Sensor.TYPE_GAME_ROTATION_VECTOR: type="TYPE_GAME_ROTATION_VECTOR"; break; case Sensor.TYPE_GRAVITY: type="TYPE_GRAVITY"; break; case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR: type="TYPE_GEOMAGNETIC_ROTATION_VECTOR"; break; case Sensor.TYPE_GYROSCOPE: type="陀螺儀感測器"; type="TYPE_GYROSCOPE"; break; case Sensor.TYPE_GYROSCOPE_UNCALIBRATED: type="TYPE_GYROSCOPE_UNCALIBRATED"; break; case Sensor.TYPE_HEART_RATE: type="TYPE_HEART_RATE"; break; case Sensor.TYPE_LIGHT: type="環境光線感測器"; type="TYPE_LIGHT"; break; case Sensor.TYPE_MAGNETIC_FIELD: type="電磁場感測器"; type="TYPE_MAGNETIC_FIELD"; break; case Sensor.TYPE_LINEAR_ACCELERATION: type="TYPE_LINEAR_ACCELERATION"; break; case Sensor.TYPE_PRESSURE: type="壓力感測器"; type="TYPE_PRESSURE"; break; case Sensor.TYPE_PROXIMITY: type="距離感測器"; type="TYPE_PROXIMITY"; break; case Sensor.TYPE_ORIENTATION: type="方向感測器"; type="TYPE_ORIENTATION"; break; case Sensor.TYPE_TEMPERATURE: type="溫度感測器"; type="TYPE_TEMPERATURE"; break; case Sensor.TYPE_STEP_COUNTER: type="TYPE_STEP_COUNTER"; break; case Sensor.TYPE_ROTATION_VECTOR: type="TYPE_ROTATION_VECTOR"; break; } sb.append(type).append("\n"); sb.append("版本:").append(s.getVersion()).append("\n"); sb.append("供應商:").append(s.getVendor()).append("\n"); sb.append("\n"); } show.setText(sb.toString()); }
效果圖如下:
下麵通過監聽加速度感測器完成搖一搖的功能,關鍵代碼如下:
public class SensorActivity extends ActionBarActivity { private SensorManager sensorManager; private Vibrator vibrator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sensor); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); vibrator=(Vibrator)getSystemService(Context.VIBRATOR_SERVICE); } @Override protected void onResume() { super.onResume(); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(listener); } private SensorEventListener listener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { //感測器數據變化執行的方法 float[] v = sensorEvent.values; int sValue = 20; float x = v[0];//x方向的加速度 float y = v[1];//y方向 float z = v[2];//z方向 if(Math.abs(x)>sValue){ vibrator.vibrate(300); } if(Math.abs(y)>sValue){ vibrator.vibrate(300); } if(Math.abs(z)>sValue){ vibrator.vibrate(300); } } @Override public void onAccuracyChanged(Sensor sensor, int i) { //精度變化的方法 } }; }
作者:傑瑞教育
出處:http://www.cnblogs.com/jerehedu/
版權聲明:本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢:
![JRedu技術交流 JRedu技術交流](http://pub.idqqimg.com/wpa/images/group.png)