您的位置:首页 > 移动开发 > Android开发

Android 手机获取加速度传感器加速度数据并自定义采样频率

2017-12-28 10:32 543 查看
原文链接:http://blog.csdn.net/llp1992/article/details/41786865

因为项目需要利用到了Android手机中的加速度传感器来获取三个加速度轴的加速度大小,同时也可以实现自定义采样频率,这个我写了一个类,通过类来控制。

获取加速度数据总体来说比较简单,首先获取服务:

[java] view
plain copy

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);  

然后在onResume()方法中注册监听器,开始使用加速度传感器:

[java] view
plain copy

sm.registerListener(this, SensorManager.SENSOR_ORIENTATION  

                | SensorManager.SENSOR_ACCELEROMETER,  

                simpleRate.get_SENSOR_RATE_FAST());  

接着是很重要的一步,在onDestory()方法中解除监听器,不然加速度传感器会一直工作,很浪费电。还有需要注意的是,手机屏幕暗掉的时候,加速度传感器还是会工作的,如果想要屏幕暗掉的时候加速度传感器步工作,则需要在onPause()方法中解除监听器。

[java] view
plain copy

@Override  

protected void onStop() {  

    // unregister listener  

    sm.unregisterListener(this);  

    super.onStop();  

}  

接下来是自定义采样频率:

注册监听器的时候最后一个参数是延迟时间,其实也就是采样频率,单位是微秒。只需要写入数字即可控制采样频率,这里通过一个类实现:

SimpleRate.java

[java] view
plain copy

package com.llp.classdifine;  

  

/** 

 * 加速度传感器采样率设定 

 *  

 * @author Liu_Longpo 

 *  

 */  

public class SimpleRate {  

  

    /** 

     * 50Hz 

     */  

    private int SENSOR_RATE_NORMAL = 20000;  

    /** 

     * 80Hz 

     */  

    private int SENSOR_RATE_MIDDLE = 12500;  

    /** 

     * 100Hz 

     */  

    private int SENSOR_RATE_FAST = 10000;  

  

    public SimpleRate() {  

    };  

  

    /** 

     * 50Hz 

     * @return 

     */  

    public int get_SENSOR_RATE_NORMAL() {  

        return this.SENSOR_RATE_NORMAL;  

    }  

  

    /** 

     * 80Hz 

     *  

     * @return 

     */  

    public int get_SENSOR_RATE_MIDDLE() {  

        return this.SENSOR_RATE_MIDDLE;  

    }  

  

    /** 

     * 100Hz 

     *  

     * @return 

     */  

    public int get_SENSOR_RATE_FAST() {  

        return this.SENSOR_RATE_FAST;  

    }  

  

}  

MainActivity.java 代码如下:

[java] view
plain copy

package com.llp.acceleration;  

  

import java.io.File;  

import java.util.ArrayList;  

  

import android.app.Activity;  

import android.hardware.SensorListener;  

import android.hardware.SensorManager;  

import android.os.Bundle;  

import android.os.Environment;  

import android.util.Log;  

import android.view.View;  

import android.widget.Button;  

import android.widget.EditText;  

import android.widget.TextView;  

import android.widget.Toast;  

  

import com.llp.classdifine.FileService;  

import com.llp.classdifine.SimpleRate;  

  

public class MainActivity extends Activity implements SensorListener {  

    SensorManager sm = null;  

    TextView acx = null;  

    TextView acy = null;  

    TextView o = null;  

    EditText fileName;  

    EditText contentWrite;  

    Button btnSave;  

    Button btnRead;  

    EditText contentRead;  

    String mfileName;  

    private FileService fileService;  

  

    double ax = 0;  

    double ay = 0;  

    double oy = 0;  

    double oz = 0;  

    double axp = 0;  

    double ayp = 0;  

    double g = 10;  

    double gp = 0;  

  

    /** 

     * 采样频率设定 

     */  

    public SimpleRate simpleRate;  

    // ArrayList<String> mDataListX = new ArrayList<String>();  

    // ArrayList<String> mDataListY = new ArrayList<String>();  

    // ArrayList<String> mDataListZ = new ArrayList<String>();  

    double tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;  

  

    /** 

     * 获取X轴加速度 

     *  

     * @return 

     */  

    public double getAccelerationX() {  

        return axp;  

    }  

  

    /** 

     * 获取Y轴加速度 

     *  

     * @return 

     */  

    public double getAccelerationY() {  

        return ayp;  

    }  

  

    /** 

     * 获取Z轴加速度 

     *  

     * @return 

     */  

    public double getOrientation() {  

  

        return Math.asin(tmp4) / Math.PI * 180.0;  

    }  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        // get reference to SensorManager  

  

        simpleRate = new SimpleRate();  

        sm = (SensorManager) getSystemService(SENSOR_SERVICE);  

        setContentView(R.layout.activity_main);  

  

        /** 

         * 创建文件夹 

         */  

        File sd = Environment.getExternalStorageDirectory();  

        String mPath = sd.getPath() + "/datas";  

        File file = new File(mPath);  

        if (!file.exists()) {  

            file.mkdir();  

        }  

        /** 

         * 控件初始化 

         */  

        initView();  

  

        btnSave.setOnClickListener(new View.OnClickListener() {  

  

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

                mfileName = fileName.getText().toString();  

//              saveAcceleration(mfileName);  

            }  

  

        });  

    }  

  

    /** 

     * 保存加速度数据 

     *  

     * @param FileName 

     * @param content 

     */  

    public void saveAcceleration(String FileName, String content) {  

        try {  

            // 判断sd卡是否存在手机上并且可以进行读写  

            if (Environment.getExternalStorageState().equals(  

                    Environment.MEDIA_MOUNTED)) {  

                fileService.write2Path(FileName, content);  

            } else {  

            }  

        } catch (Exception e) {  

            Log.v("test", e.toString());  

        }  

    }  

  

    public void initView() {  

        acx = (TextView) findViewById(R.id.xbox);  

        acy = (TextView) findViewById(R.id.ybox);  

        o = (TextView) findViewById(R.id.obox);  

        fileName = (EditText) findViewById(R.id.fileName);  

        contentWrite = (EditText) findViewById(R.id.content);  

        btnSave = (Button) findViewById(R.id.btnsave);  

        btnRead = (Button) findViewById(R.id.btnread);  

        contentRead = (EditText) findViewById(R.id.contentread);  

    }  

  

    public void onSensorChanged(int sensor, float[] values) {  

        synchronized (this) {  

            if (sensor == SensorManager.SENSOR_ORIENTATION) {  

                oy = values[1];  

                oz = values[2];  

            }  

            if (sensor == SensorManager.SENSOR_ACCELEROMETER) {  

                ax = values[0];  

                ay = values[1];  

            }  

  

            tmp1 = Math.sin(oz * Math.PI / 180.0);  

            tmp2 = Math.sin(Math.abs(oy) * Math.PI / 180.0);  

            tmp3 = Math.sqrt(tmp1 * tmp1 + tmp2 * tmp2);  

            tmp4 = tmp1 / tmp3;  

  

            gp = 10 * tmp3;  

            axp = ax * Math.cos(tmp4) + ay * Math.sin(tmp4);  

            ayp = -ax * Math.sin(tmp4) + ay * Math.cos(tmp4) + gp;  

            acx.setText("a X: " + getAccelerationX());  

            acy.setText("a Y: " + getAccelerationY());  

            o.setText("Orientation : " + getOrientation());  

            // mDataListX.add(getAccelerationX() + "\n");  

            // mDataListY.add(getAccelerationY() + "\n");  

            // mDataListZ.add(getOrientation() + "\n");  

        }  

    }  

  

    public void onAccuracyChanged(int sensor, int 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,  

                simpleRate.get_SENSOR_RATE_FAST());  

    }  

  

    @Override  

    protected void onStop() {  

        // unregister listener  

        sm.unregisterListener(this);  

        super.onStop();  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  手机传感器
相关文章推荐