在Android系統(tǒng)中開發(fā)傳感器應(yīng)用十分簡單蜻底,因為Android系統(tǒng)為傳感器支持提供了強(qiáng)大的管理服務(wù),同樣傳感器的種類也有許多恰力。
簡單的開發(fā)步驟如下:
- 1.調(diào)用Context的getSystemService(Context.SENSOR_SERVICE)方法獲取SensorManager對象狰右,即傳感器管理服務(wù)貌嫡。
- 2.調(diào)用SensorManager的getDefaultSensor(int type)方法獲取指定的傳感器類型驾窟。
- 3.通常選擇在Activity的o你Resume()方法中調(diào)用SensorManager的registerListener()方法注冊監(jiān)聽器庆猫,可獲取傳回的數(shù)據(jù)。
registerListener()方法的三個參數(shù)如下:
- listener 監(jiān)聽傳感器的監(jiān)聽器纫普。
- sensor 傳感器對象阅悍。
- rate 獲取的傳感器數(shù)據(jù)頻率好渠。
其中的rate值有四種形式分別是:
- SensorManager.SENSOR_DELAY_FASTEST:頻率最快昨稼,延遲最小节视,但手機(jī)耗電量大,資源消耗較多假栓。
- SensorManager.SENSOR_DELAY_GAME:適合游戲開發(fā)的頻率寻行。
- SensorManager.SENSOR_DELAY_NORMAL:正常頻率,對及時性要求不高的適合使用這種匾荆。
- SensorManager.SENSOR_DELAY_UI:適合普通用戶界面的頻率拌蜘,這種模式比較省電,內(nèi)存消耗不大牙丽,不過延遲較大简卧。
Android中常用的傳感器有:方向傳感器,陀螺儀傳感器烤芦,磁場傳感器举娩,重力傳感器,線性加速度傳感器构罗,溫度傳感器铜涉,光傳感器,壓力傳感器遂唧。
下面是代碼介紹了所有傳感器的使用:
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity
implements SensorEventListener
{
// 定義Sensor管理器
private SensorManager mSensorManager;
EditText etOrientation;
EditText etGyro;
EditText etMagnetic;
EditText etGravity;
EditText etLinearAcc;
EditText etTemerature;
EditText etLight;
EditText etPressure;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取界面上的EditText組件
etOrientation = (EditText) findViewById(R.id.etOrientation);
etGyro = (EditText) findViewById(R.id.etGyro);
etMagnetic = (EditText) findViewById(R.id.etMagnetic);
etGravity = (EditText) findViewById(R.id.etGravity);
etLinearAcc = (EditText) findViewById(R.id.etLinearAcc);
etTemerature = (EditText) findViewById(R.id.etTemerature);
etLight = (EditText) findViewById(R.id.etLight);
etPressure = (EditText) findViewById(R.id.etPressure);
// 獲取傳感器管理服務(wù)
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); // ①
}
@Override
protected void onResume()
{
super.onResume();
// 為系統(tǒng)的方向傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的陀螺儀傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的磁場傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的重力傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的線性加速度傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的溫度傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的光傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_GAME);
// 為系統(tǒng)的壓力傳感器注冊監(jiān)聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onStop()
{
// 程序退出時取消注冊傳感器監(jiān)聽器
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
protected void onPause()
{
// 程序暫停時取消注冊傳感器監(jiān)聽器
mSensorManager.unregisterListener(this);
super.onPause();
}
// 以下是實現(xiàn)SensorEventListener接口必須實現(xiàn)的方法
@Override
// 當(dāng)傳感器精度改變時回調(diào)該方法芙代。
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
@Override
public void onSensorChanged(SensorEvent event)
{
float[] values = event.values;
// 獲取觸發(fā)event的傳感器類型
int sensorType = event.sensor.getType();
StringBuilder sb = null;
// 判斷是哪個傳感器發(fā)生改變
switch (sensorType)
{
// 方向傳感器
case Sensor.TYPE_ORIENTATION:
sb = new StringBuilder();
sb.append("繞Z軸轉(zhuǎn)過的角度:");
sb.append(values[0]);
sb.append("\n繞X軸轉(zhuǎn)過的角度:");
sb.append(values[1]);
sb.append("\n繞Y軸轉(zhuǎn)過的角度:");
sb.append(values[2]);
etOrientation.setText(sb.toString());
break;
// 陀螺儀傳感器
case Sensor.TYPE_GYROSCOPE:
sb = new StringBuilder();
sb.append("繞X軸旋轉(zhuǎn)的角速度:");
sb.append(values[0]);
sb.append("\n繞Y軸旋轉(zhuǎn)的角速度:");
sb.append(values[1]);
sb.append("\n繞Z軸旋轉(zhuǎn)的角速度:");
sb.append(values[2]);
etGyro.setText(sb.toString());
break;
// 磁場傳感器
case Sensor.TYPE_MAGNETIC_FIELD:
sb = new StringBuilder();
sb.append("X軸方向上的磁場強(qiáng)度:");
sb.append(values[0]);
sb.append("\nY軸方向上的磁場強(qiáng)度:");
sb.append(values[1]);
sb.append("\nZ軸方向上的磁場強(qiáng)度:");
sb.append(values[2]);
etMagnetic.setText(sb.toString());
break;
// 重力傳感器
case Sensor.TYPE_GRAVITY:
sb = new StringBuilder();
sb.append("X軸方向上的重力:");
sb.append(values[0]);
sb.append("\nY軸方向上的重力:");
sb.append(values[1]);
sb.append("\nZ方向上的重力:");
sb.append(values[2]);
etGravity.setText(sb.toString());
break;
// 線性加速度傳感器
case Sensor.TYPE_LINEAR_ACCELERATION:
sb = new StringBuilder();
sb.append("X軸方向上的線性加速度:");
sb.append(values[0]);
sb.append("\nY軸方向上的線性加速度:");
sb.append(values[1]);
sb.append("\nZ軸方向上的線性加速度:");
sb.append(values[2]);
etLinearAcc.setText(sb.toString());
break;
// 溫度傳感器
case Sensor.TYPE_AMBIENT_TEMPERATURE:
sb = new StringBuilder();
sb.append("當(dāng)前溫度為:");
sb.append(values[0]);
etTemerature.setText(sb.toString());
break;
// 光傳感器
case Sensor.TYPE_LIGHT:
sb = new StringBuilder();
sb.append("當(dāng)前光的強(qiáng)度為:");
sb.append(values[0]);
etLight.setText(sb.toString());
break;
// 壓力傳感器
case Sensor.TYPE_PRESSURE:
sb = new StringBuilder();
sb.append("當(dāng)前壓力為:");
sb.append(values[0]);
etPressure.setText(sb.toString());
break;
}
}
}
總結(jié)
在手機(jī)屏幕中傳感器所指定的X,Y,Z軸是以手機(jī)屏幕中心為圓心的,并不是View視圖內(nèi)的左上角盖彭!
onSensorChanged():當(dāng)傳感器的值發(fā)生改變時觸發(fā)纹烹。
onAccuracyChanged():當(dāng)傳感器的精度發(fā)生改變時觸發(fā)。