Android的傳感器開發(fā)

在Android系統(tǒng)中開發(fā)傳感器應(yīng)用十分簡單,因?yàn)锳ndroid系統(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()方法的三個(gè)參數(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:正常頻率,對及時(shí)性要求不高的適合使用這種。
  • 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()
    {
        // 程序退出時(shí)取消注冊傳感器監(jiān)聽器
        mSensorManager.unregisterListener(this);
        super.onStop();
    }
    @Override
    protected void onPause()
    {
        // 程序暫停時(shí)取消注冊傳感器監(jiān)聽器
        mSensorManager.unregisterListener(this);
        super.onPause();
    }
    // 以下是實(shí)現(xiàn)SensorEventListener接口必須實(shí)現(xiàn)的方法
    @Override
    // 當(dāng)傳感器精度改變時(shí)回調(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;
        // 判斷是哪個(gè)傳感器發(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ā)生改變時(shí)觸發(fā)。
onAccuracyChanged():當(dāng)傳感器的精度發(fā)生改變時(shí)觸發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容