Android的傳感器開發
在Android系統中開發傳感器應用十分簡單,因為Android系統為傳感器支持提供了強大的管理服務,同樣傳感器的種類也有許多。
簡單的開發步驟如下:
- 1.調用Context的getSystemService(Context.SENSOR_SERVICE)方法獲取SensorManager對象,即傳感器管理服務。
- 2.調用SensorManager的getDefaultSensor(int type)方法獲取指定的傳感器類型。
- 3.通常選擇在Activity的o你Resume()方法中調用SensorManager的registerListener()方法注冊監聽器,可獲取傳回的數據。
registerListener()方法的四個參數如下:
- listener 監聽傳感器的監聽器。
- sensor 傳感器對象。
- rate 獲取的傳感器數據頻率。
其中的rate值有四種形式分別是:
- SensorManager.SENSOR_DELAY_FASTEST:頻率最快,延遲最小,但手機耗電量大,資源消耗較多。
- SensorManager.SENSOR_DELAY_GAME:適合游戲開發的頻率。
- SensorManager.SENSOR_DELAY_NORMAL:正常頻率,對及時性要求不高的適合使用這種。
- SensorManager.SENSOR_DELAY_UI:適合普通用戶界面的頻率,這種模式比較省電,內存消耗不大,不過延遲較大。
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);
// 獲取傳感器管理服務
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_GYROSCOPE),
SensorManager.SENSOR_DELAY_GAME);
// 為系統的磁場傳感器注冊監聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
// 為系統的重力傳感器注冊監聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_GAME);
// 為系統的線性加速度傳感器注冊監聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_GAME);
// 為系統的溫度傳感器注冊監聽器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_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 onStop()
{
// 程序退出時取消注冊傳感器監聽器
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
protected void onPause()
{
// 程序暫停時取消注冊傳感器監聽器
mSensorManager.unregisterListener(this);
super.onPause();
}
// 以下是實現SensorEventListener接口必須實現的方法
@Override
// 當傳感器精度改變時回調該方法。
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
@Override
public void onSensorChanged(SensorEvent event)
{
float[] values = event.values;
// 獲取觸發event的傳感器類型
int sensorType = event.sensor.getType();
StringBuilder sb = null;
// 判斷是哪個傳感器發生改變
switch (sensorType)
{
// 方向傳感器
case Sensor.TYPE_ORIENTATION:
sb = new StringBuilder();
sb.append("繞Z軸轉過的角度:");
sb.append(values[0]);
sb.append("\n繞X軸轉過的角度:");
sb.append(values[1]);
sb.append("\n繞Y軸轉過的角度:");
sb.append(values[2]);
etOrientation.setText(sb.toString());
break;
// 陀螺儀傳感器
case Sensor.TYPE_GYROSCOPE:
sb = new StringBuilder();
sb.append("繞X軸旋轉的角速度:");
sb.append(values[0]);
sb.append("\n繞Y軸旋轉的角速度:");
sb.append(values[1]);
sb.append("\n繞Z軸旋轉的角速度:");
sb.append(values[2]);
etGyro.setText(sb.toString());
break;
// 磁場傳感器
case Sensor.TYPE_MAGNETIC_FIELD:
sb = new StringBuilder();
sb.append("X軸方向上的磁場強度:");
sb.append(values[0]);
sb.append("\nY軸方向上的磁場強度:");
sb.append(values[1]);
sb.append("\nZ軸方向上的磁場強度:");
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("當前溫度為:");
sb.append(values[0]);
etTemerature.setText(sb.toString());
break;
// 光傳感器
case Sensor.TYPE_LIGHT:
sb = new StringBuilder();
sb.append("當前光的強度為:");
sb.append(values[0]);
etLight.setText(sb.toString());
break;
// 壓力傳感器
case Sensor.TYPE_PRESSURE:
sb = new StringBuilder();
sb.append("當前壓力為:");
sb.append(values[0]);
etPressure.setText(sb.toString());
break;
}
}
}
總結
在手機屏幕中傳感器所指定的X,Y,Z軸是以手機屏幕中心為圓心的,并不是View視圖內的左上角!
onSensorChanged():當傳感器的值發生改變時觸發。
onAccuracyChanged():當傳感器的精度發生改變時觸發。
來自:http://www.jianshu.com/p/204fe157cd61
本文由用戶 ft4386 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!