安卓傳感器api

安卓提供了對傳感器的支持,如果手機設備的硬件支持了這些傳感器,那麼利用傳感器可以開發出一些非常有趣的應用,這種模式在3D遊戲中已經非常常見。

大體上,一般的智能機能支持幾種常見的傳感器:

》Orientation ---方向傳感器

》Tempreture ---溫度傳感器

》Light ---光傳感器

》Pressure ---壓力傳感器

》Magnetic Field ---磁場傳感器

》Accelerometer ---加速度傳感器


傳感器的幾個重要的API:
SensorManager

Sensor

SensorEvent (綁定SensorEventListener)

所以開發傳感器應用的步驟如下:
1 調用Context的getSystemService(Context.SENSOR_SERVICE)方法獲取SensorManager對象,SensorManager對象代表系統的傳感器管理服務。

2 調用SensorManager的getDefaultSensor(int type)方法獲取指定類型的傳感器;

3 一般在Activity的OnResume()方法中調用SensorManager的registerListener()爲指定傳感器註冊監聽器

4 在Activity的OnStop()方法中註銷對傳感器的註冊。


註冊指定傳感器的方法如下:
registerListener(SensorEventListener listener,Sensor sensor,int rate)

三個參數意義如下:
listener:爲傳感器註冊的SensorEventListener;

sensor:指定的傳感器;

rate:這個參數表示獲取傳感器的頻率,它支持如下幾個頻率值:
SensorManager.SENSOR_DELAY_FASTEST: 最快的模式,帶式消耗的電能比較大,佔用性能大;
SensorManager.SENSOR_DELAY_GAME: 適合遊戲的模式;
SensorManager.SENSOR_DELAY_NORMAL: 正常的模式,對實時性要求不是特別高的應用更適合這個頻率;

SensorManager.SENSOR_DELAY_UI: 適合普通用戶界面的頻率。


下面以一個簡單地示例說明幾個傳感器的具體用法:

由於在真機上運行要安裝傳感器模擬器,所以此例是運行在真機上的:

package org.crazyit.sensor;

import android.annotation.SuppressLint;
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.widget.EditText;


public class SensorSimulatorTest extends Activity
implements SensorEventListener
{

private SensorManager mSensorManager;
EditText etOrientation;
EditText etMagnetic;
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);
etMagnetic = (EditText) findViewById(R.id.etMagnetic);
etTemerature = (EditText) findViewById(R.id.etTemerature);
etLight = (EditText) findViewById(R.id.etLight);
etPressure = (EditText) findViewById(R.id.etPressure);


// 獲取真機的傳感器管理服務
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
獲取SensorManager服務,類似的LocationManager,AudioManager,TelephonyManager;
}


@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 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_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_TEMPERATURE:
sb = new StringBuilder();
sb.append("當前溫度爲:");
sb.append(values[0]);
etTemerature.setText(sb.toString());
break;
// 光傳感器
case Sensor.TYPE_LIGHT:
sb = new StringBuilder();

if(values[0]>1000){
sb.append("陽光明媚");}
else if(values[0]>100){
sb.append("陰天");
}else{
sb.append("天氣惡劣");
}
etLight.setText(sb.toString());
break;
// 壓力傳感器
case Sensor.TYPE_PRESSURE:
sb = new StringBuilder();
sb.append("當前壓力爲:");
sb.append(values[0]);
etPressure.setText(sb.toString());
break;
}
}
}
截圖:

由於很多手機上都沒有溫度傳感器,而且電池的溫度會干擾到溫度檢測,所以寫一個實時的溫度計變得有點難,但是其他的傳感器還是非常有用的,比如方向傳感器,我們可以利用它開發指南針,水平儀,遊戲中可以利用它判定方向,所以在安卓應用中適當加一些傳感器功能能使你的應用增色不少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章