Android的傳感器開發

ft4386 8年前發布 | 7K 次閱讀 安卓開發 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!