Android 手机获取加速度传感器加速度数据并自定义采样频率
2014-12-07 13:17
483 查看
因为项目需要利用到了Android手机中的加速度传感器来获取三个加速度轴的加速度大小,同时也可以实现自定义采样频率,这个我写了一个类,通过类来控制。
获取加速度数据总体来说比较简单,首先获取服务:
然后在onResume()方法中注册监听器,开始使用加速度传感器:
接着是很重要的一步,在onDestory()方法中解除监听器,不然加速度传感器会一直工作,很浪费电。还有需要注意的是,手机屏幕暗掉的时候,加速度传感器还是会工作的,如果想要屏幕暗掉的时候加速度传感器步工作,则需要在onPause()方法中解除监听器。
接下来是自定义采样频率:
注册监听器的时候最后一个参数是延迟时间,其实也就是采样频率,单位是微秒。只需要写入数字即可控制采样频率,这里通过一个类实现:
SimpleRate.java
MainActivity.java 代码如下:
获取加速度数据总体来说比较简单,首先获取服务:
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
然后在onResume()方法中注册监听器,开始使用加速度传感器:
sm.registerListener(this, SensorManager.SENSOR_ORIENTATION | SensorManager.SENSOR_ACCELEROMETER, simpleRate.get_SENSOR_RATE_FAST());
接着是很重要的一步,在onDestory()方法中解除监听器,不然加速度传感器会一直工作,很浪费电。还有需要注意的是,手机屏幕暗掉的时候,加速度传感器还是会工作的,如果想要屏幕暗掉的时候加速度传感器步工作,则需要在onPause()方法中解除监听器。
@Override protected void onStop() { // unregister listener sm.unregisterListener(this); super.onStop(); }
接下来是自定义采样频率:
注册监听器的时候最后一个参数是延迟时间,其实也就是采样频率,单位是微秒。只需要写入数字即可控制采样频率,这里通过一个类实现:
SimpleRate.java
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 代码如下:
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(); }
}
相关文章推荐
- Android 手机获取加速度传感器加速度数据并自定义采样频率
- android手机 加速度传感器 获取x,y,z轴上的加速度
- Android之ListView分页(手机客户端自定义数据源)获取网路数据(二)
- android手机如何获取某APP的页面耗时数据(命令行方式)
- android 命令获取手机中项目数据库
- android开发之工具类:获取手机设备的一些数据DeviceUtil
- React Native Android原生模块使用(获取Android手机通讯录的数据)
- 实时获取Android手机CPU频率
- Android Loader(四) 自定义Loader从网络中获取文本数据
- Android从零单排之手机客户端http获取Web服务器数据实例
- 红米手机在Android开发中无法获取data/data中数据的问题
- Android手机号码归属地的查询(使用聚合数据API,获取JSON数据并解析)
- Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐
- android学习历程,自定义listview并从服务器端获取数据填充进listview
- android开发之工具类:获取手机设备的一些数据DeviceUtil
- Android基础---获取手机硬件数据(转)
- Android---35---openFileInput、openFileOutput获取手机内存中的数据
- android 如何在自定义对话框中获取edittext中的数据
- android 回调接口学习(自定义Dialog 获取数据数据回调)
- android学习历程,自定义listview并从服务器端获取数据填充进listview