Android 感測器可以隨處監控環境
 
如:方向、加速表、光線、磁場、臨近性、溫度等
android.hardware.SensorManager 包含幾個常量,這表示 Android 感測器系統的不同方面,包括:

 

感測器類型方向、加速表、光線、磁場、臨近性、溫度等。取樣速率最快、遊戲、普通、使用者介面。當應用程式請求特定的取樣速率時,其實只是對感測器子系統的一個提示,或者一個建議。不保證特定的取樣速率可用。準確性高、低、中、不可靠。

 

SensorListener 介面是感測器應用程式的中心。它包括兩個必需方法:

 

onSensorChanged(int sensor,float values[]) 方法在感測器值更改時調用。該方法只對受此應用程式監視的感測器調用(更多內容見下文)。該方法的參數包括:一個整數,指示更改的感測器;一個浮點值陣列,表示感測器資料本身。有些感測器只提供一個資料值,另一些則提供三個浮點值。方向和加速表感測器都提供三個數據值。

 

當感測器的準確性更改時,將調用 onAccuracyChanged(int sensor,int accuracy) 方法。參數包括兩個整數:一個表示感測器,另一個表示該感測器新的準確值。

 

要與感測器交互,應用程式必須註冊以偵聽與一個或多個感測器相關的活動。註冊使用 SensorManager 類的registerListener 方法完成。本文中的 代碼示例 演示了如何註冊和登出 SensorListener。
 
示例1:
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.hardware.SensorManager;
import android.hardware.SensorListener;
public class IBMEyes extends Activity implements SensorListener {
final String tag = "IBMEyes";
SensorManager sm = null;
TextView xViewA = null;
TextView yViewA = null;
TextView zViewA = null;
TextView xViewO = null;
TextView yViewO = null;
TextView zViewO = null;

 

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// get reference to SensorManager
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.main);
xViewA = (TextView) findViewById(R.id.xbox);
yViewA = (TextView) findViewById(R.id.ybox);
zViewA = (TextView) findViewById(R.id.zbox);
xViewO = (TextView) findViewById(R.id.xboxo);
yViewO = (TextView) findViewById(R.id.yboxo);
zViewO = (TextView) findViewById(R.id.zboxo);
}
public void onSensorChanged(int sensor, float[] values) {
synchronized (this) {
Log.d(tag, "onSensorChanged: " + sensor + ", x: " +
values[0] + ", y: " + values[1] + ", z: " + values[2]);
if (sensor == SensorManager.SENSOR_ORIENTATION) {
xViewO.setText("Orientation X: " + values[0]);
yViewO.setText("Orientation Y: " + values[1]);
zViewO.setText("Orientation Z: " + values[2]);
}
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
xViewA.setText("Accel X: " + values[0]);
yViewA.setText("Accel Y: " + values[1]);
zViewA.setText("Accel Z: " + values[2]);
}
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy);
}
@Override
protected void onResume() {
super.onResume();
// register this class as a listener for the orientation and accelerometer sensors
sm.registerListener(this,
SensorManager.SENSOR_ORIENTATION |SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_NORMAL);
}

 

@Override
protected void onPause()() {
// unregister listener
sm.unregisterListener(this);
super.onPause()();
}
}
該活動的 onCreate 方法可以引用 SensorManager,其中包含所有與感測器有關的函數。
onCreate 方法還建立了對 6 個 TextView 小部件的引用,您需要使用感測器資料值更新這些小部件。

 

onResume() 方法使用對 SensorManager 的引用通過 registerListener 方法註冊感測器更新:

 

第一個參數是實現 SensorListener 介面的類的實例。

 

第二個參數是所需感測器的位元遮罩。在本例中,應用程式從 SENSOR_ORIENTATION 和 SENSOR_ACCELEROMETER 請求資料。

 

第三個參數是一個系統提示,指出應用程式更新感測器值所需的速度。

 

應用程式(活動)暫停後,需要登出偵聽器,這樣以後就不會再收到感測器更新。
這通過 SensorManager 的 unregisterListener 方法實現。惟一的參數是 SensorListener 的實例。

 

在 registerListener 和 unregisterListener 方法調用中,應用程式使用關鍵字 this。
注意類定義中的 implements 關鍵字,其中聲明瞭該類實現 SensorListener 介面。這就是要將它傳遞到 registerListener 和 unregisterListener 的原因。

 

SensorListener 必須實現兩個方法 onSensorChange 和 onAccuracyChanged。
示例應用程式不關心感測器的準確度,但關注感測器當前的 X、Y 和 Z 值。
onAccuracyChanged 方法實質上不執行任何操作;它只在每次調用時添加一個日誌項。

 

似乎經常需要調用 onSensorChanged 方法,因為加速表和方向感測器正在快速發送資料。
查看第一個參數確定哪個感測器在發送資料。確認了發送資料的感測器之後,
將使用方法第二個參數傳遞的浮點值陣列中所包含的資料更新相應的 UI 元素
注意:在不用對感測器進行監聽時,一定要及時的取消監聽。
 
 
FROM:http://blog.csdn.net/hudashi/article/details/6880565

 

    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()