在上文中介紹了加速度感應器,並以真機和模擬器兩種方式進行了測試。在本文中將介紹其餘幾種感應器,它們的處理方式完全一樣。這裡就只用真機進行測試了。 1、方向感應器:返回三個角度 第一個角度:表示手機頂部朝向與正北方的夾角。範圍0~360 第二個角度:表示手機頂部或尾部翹起的角度。範圍-180~180 第三個角度:表示手機左側或右側翹起的角度。範圍-90~90 2、磁場感應器:返回三個資料,分別代表周圍磁場分解到X、Y、Z三個方向上的分量。 3、溫度感應器:返回一個資料,表示手機裝置周圍溫度。 4、光感應器:返回一個資料,表示手機裝置周圍的光的強度。 5、壓力感應器:返回一個資料,表示手機裝置周圍的壓力大小。 下面用一個簡單樣本來示範它們的使用,代碼如下: Activity:
package com.home.sensor; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.EditText; import android.app.Activity; public class SensorTestActivity extends Activity implements SensorEventListener { // 定義真機的感應器管理器 private SensorManager mSensorManager; private EditText orientation; private EditText magnetic; private EditText temerature; private EditText light; private EditText pressure; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 擷取介面上的EditText組件 orientation = (EditText) findViewById(R.id.main_et_orientation); magnetic = (EditText) findViewById(R.id.main_et_magnetic); temerature = (EditText) findViewById(R.id.main_et_temerature); light = (EditText) findViewById(R.id.main_et_light); pressure = (EditText) findViewById(R.id.main_et_pressure); // 擷取真機的感應器管理服務 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); // 為系統的方向感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); // 為系統的磁場感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME); // 為系統的溫度感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_GAME); // 為系統的光感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_GAME); // 為系統的壓力感應器註冊監聽器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super.onPause(); // 程式暫停時取消註冊感應器監聽器 mSensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; StringBuffer sb = null; switch (event.sensor.getType()) { // 方向感應器 case Sensor.TYPE_ORIENTATION: sb = new StringBuffer(); sb.append("繞Z軸轉過的角度:" + values[0]); sb.append("\n繞X軸轉過的角度:" + values[1]); sb.append("\n繞Y軸轉過的角度:" + values[2]); orientation.setText(sb.toString()); break; // 磁場感應器 case Sensor.TYPE_MAGNETIC_FIELD: sb = new StringBuffer(); sb.append("X方向上的磁場分量:" + values[0]); sb.append("\nY方向上的磁場分量:" + values[1]); sb.append("\nZ方向上的磁場分量:" + values[2]); magnetic.setText(sb.toString()); break; // 溫度感應器 case Sensor.TYPE_TEMPERATURE: sb = new StringBuffer(); sb.append("當前溫度為:" + values[0]); temerature.setText(sb.toString()); break; // 光感應器 case Sensor.TYPE_LIGHT: sb = new StringBuffer(); sb.append("當前光的強度:" + values[0]); light.setText(sb.toString()); break; // 壓力感應器 case Sensor.TYPE_PRESSURE: sb = new StringBuffer(); sb.append("當前壓力為:" + values[0]); pressure.setText(sb.toString()); break; } } } package com.home.sensor;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.widget.EditText;import android.app.Activity;public class SensorTestActivity extends Activity implements SensorEventListener {// 定義真機的感應器管理器private SensorManager mSensorManager;private EditText orientation;private EditText magnetic;private EditText temerature;private EditText light;private EditText pressure;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 擷取介面上的EditText組件orientation = (EditText) findViewById(R.id.main_et_orientation);magnetic = (EditText) findViewById(R.id.main_et_magnetic);temerature = (EditText) findViewById(R.id.main_et_temerature);light = (EditText) findViewById(R.id.main_et_light);pressure = (EditText) findViewById(R.id.main_et_pressure);// 擷取真機的感應器管理服務mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);}@Overrideprotected void onResume() {super.onResume();// 為系統的方向感應器註冊監聽器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);// 為系統的磁場感應器註冊監聽器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_GAME);// 為系統的溫度感應器註冊監聽器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE),SensorManager.SENSOR_DELAY_GAME);// 為系統的光感應器註冊監聽器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_GAME);// 為系統的壓力感應器註冊監聽器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onPause() {super.onPause();// 程式暫停時取消註冊感應器監聽器mSensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic void onSensorChanged(SensorEvent event) {float[] values = event.values;StringBuffer sb = null;switch (event.sensor.getType()) {// 方向感應器case Sensor.TYPE_ORIENTATION:sb = new StringBuffer();sb.append("繞Z軸轉過的角度:" + values[0]);sb.append("\n繞X軸轉過的角度:" + values[1]);sb.append("\n繞Y軸轉過的角度:" + values[2]);orientation.setText(sb.toString());break;// 磁場感應器case Sensor.TYPE_MAGNETIC_FIELD:sb = new StringBuffer();sb.append("X方向上的磁場分量:" + values[0]);sb.append("\nY方向上的磁場分量:" + values[1]);sb.append("\nZ方向上的磁場分量:" + values[2]);magnetic.setText(sb.toString());break;// 溫度感應器case Sensor.TYPE_TEMPERATURE:sb = new StringBuffer();sb.append("當前溫度為:" + values[0]);temerature.setText(sb.toString());break;// 光感應器case Sensor.TYPE_LIGHT:sb = new StringBuffer();sb.append("當前光的強度:" + values[0]);light.setText(sb.toString());break;// 壓力感應器case Sensor.TYPE_PRESSURE:sb = new StringBuffer();sb.append("當前壓力為:" + values[0]);pressure.setText(sb.toString());break;}}}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/main_et_orientation" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_magnetic" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_temerature" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_light" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_pressure" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/main_et_orientation" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_magnetic" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_temerature" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_light" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /> <EditText android:id="@+id/main_et_pressure" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" /></LinearLayout>