進階篇-安卓系統:4.安卓手機動做傳感器

      動做傳感器對於監測設備的移動很是有用,例如:傾斜、震動、旋轉和擺動都屬於動做傳感器的監測範圍。設備的移動一般是對用戶輸入的直接反應。java

      全部動做傳感器都會返回三個浮點數的值,對於不一樣的傳感器,這三個值的意義不一樣。例如,對於加速度傳感器,會返回三個座標軸的加速數據。對於陀螺儀傳感器,會返回三個座標周的旋轉角速度。android

動做傳感器的使用與數據返回:加速度傳感器app

若是單純的使用加速度傳感器傳回的數據,會發現Z軸的的加速度是9.8多。因此看來安卓是把靜止的手機豎直加速度默認爲重力加速度,而且XY軸的數據也不是很準確。這並非咱們要的效果。因此須要藉助重力傳感器的數據來調整加速的的傳感器,使其的數據更加精確。ide

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.List;

public class MainActivity extends AppCompatActivity implements SensorEventListener{
    private SensorManager mSensorManager;
    private float[] gravity = new float[3];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);



    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {  //this method will be called when the sensor accuracy changed
        switch (sensorEvent.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                final float alpha = (float) 0.8;
                gravity[0] = alpha * gravity[0] + (1 - alpha) * sensorEvent.values[0];
                gravity[1] = alpha * gravity[1] + (1 - alpha) * sensorEvent.values[1];
                gravity[2] = alpha * gravity[2] + (1 - alpha) * sensorEvent.values[2];
                String data = "Acceleration:\n"+"X:"+(sensorEvent.values[0] - gravity[0])+"\n"+"Y:"+(sensorEvent.values[1] - gravity[1])+"\n"+"Z:"+(sensorEvent.values[2] - gravity[2])+"\n";
                System.out.println(data);
                //System.out.println(sensorEvent.values[2] - gravity[2]);
                break;
            case Sensor.TYPE_GRAVITY:
                gravity[0]=sensorEvent.values[0];
                gravity[1]=sensorEvent.values[1];
                gravity[2]=sensorEvent.values[2];
                break;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {//this method will be called when the sensor data changed

    }

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI);
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }
}

咱們在onResume方法中註冊傳感器。在onPause方法中解除註冊傳感器。this

視頻裏面並無講爲何這麼處理數據能減少偏差。我看了半天也沒有看出來——!因此這個筆記就記下來這個減少偏差的方法吧。spa

輸出結果:code

07-15 20:49:12.663 28389-28389/bhu.com.myapplication I/System.out: Acceleration:
07-15 20:49:12.673 28389-28389/bhu.com.myapplication I/System.out: X:0.010284543
07-15 20:49:12.683 28389-28389/bhu.com.myapplication I/System.out: Y:7.79517E-4
07-15 20:49:12.683 28389-28389/bhu.com.myapplication I/System.out: Z:0.010925293
07-15 20:49:12.723 28389-28389/bhu.com.myapplication I/System.out: Acceleration: 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: X:-0.10639935 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: Y:0.017798994 07-15 20:49:12.733 28389-28389/bhu.com.myapplication I/System.out: Z:0.018583298
07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Acceleration: 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: X:0.04853201 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Y:-0.03271977 07-15 20:49:12.793 28389-28389/bhu.com.myapplication I/System.out: Z:0.04224682

看來這個加速度傳感器仍是很敏感的。微小的震動也能精確的測量出來。視頻

相關文章
相關標籤/搜索