android 传感器使用与开发
来源:互联网 发布:手机淘宝9.9包邮 编辑:程序博客网 时间:2024/05/23 22:07
作为一个知识点:留作记忆
本文要采集加速度传感器,磁场传感器和陀螺仪传感器的数据
TextView根据自己实际需要自行添加
sensor相关API被放到了android.hardware包下,我们主要使用的类有三个:Sensor、SensorEvent、SensorManager以及一个SensorEventListener接口。
SensorManager顺其自然的担任起管理的工作,负责注册监听某Sensor的状态;Sensor的数据通过SensorEvent返回。
这里加速度指重力加速度,所以在静止时重力传感器的返回值与加速度传感器值相同。
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。
将手机朝下放在桌面上,z轴为-9.81。
将手机向左倾斜,x轴为正值。
将手机向右倾斜,x轴为负值。
将手机向上倾斜,y轴为负值。
将手机向下倾斜,y轴为正值。
磁力传感器,返回x、y、z三轴的环境磁场数据。
硬件上一般没有独立的磁力传感器,磁力数据由电子罗盘传感器提供(E-compass)。
电子罗盘传感器同时提供下文的方向传感器数据。
陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。手机里陀螺仪实际上是一个结构非常精密的芯片,内部包含超微小的陀螺。
陀螺仪的强项在于测量设备自身的旋转运动。对设备自身运动更擅长。但不能确定设备的方位。 陀螺仪对设备旋转角度的检测是瞬时的而且是非常精确的,能满足一些需要高分辨率和快速反应的应用比如FPS游戏的瞄准。而且陀螺仪配合加速计可以在没有卫星和网络的情况下进行导航,这是陀螺仪的经典应用。同时处理直线运动和旋转运动时,就需要把加速度和陀螺仪计结合起来使用。如果还想设备在运动时不至于迷失方向,就再加上磁力计。
因为手机运动的加速度不高,精确度也没有太大的要求,用加速计替代陀螺仪也可以。但如果做一些精度比较高的游戏的话,最好还是有陀螺仪。
水平逆时针旋转,Z轴为正。
水平逆时针旋转,z轴为负。
向左旋转,y轴为负。
向右旋转,y轴为正。
向上旋转,x轴为负。
向下旋转,x轴为正
首先:
implements SensorEventListener
再声明:
// //Sensor////////////////////////////////////////////////////
//传感器管理,及对象声明
private SensorManager mSensorManager;
private Sensor mMagneticSensor;
private Sensor mAccelerometerSensor;
private Sensor mGyroscopeSensor;
private TextView mShowTextView;
// 纳秒
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
private float angle[] = new float[3];
初始化:
private void initSensor() {
// 传感器管理
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取陀螺仪,磁场,加速度传感器实例
mGyroscopeSensor = mSensorManager
.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mMagneticSensor = mSensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mAccelerometerSensor = mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是SensorManager.SENSOR_DELAY_GAME(20000微秒)
// SensorManager.SENSOR_DELAY_UI(60000微秒):最慢
// SensorManager.SENSOR_DELAY_NORMAL(200000微秒):普通
// SensorManager.SENSOR_DELAY_FASTEST(0微秒):最快
mSensorManager.registerListener(this, mGyroscopeSensor,
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this, mMagneticSensor,
SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this, mAccelerometerSensor,
SensorManager.SENSOR_DELAY_GAME);
}
然后实现功能:具体接口回调
// 精度变化监听回调
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 传感器发生变化监听回调
@Override
public void onSensorChanged(SensorEvent event) {
// 坐标轴都是手机从左侧到右侧的水平方向为x轴正向,从手机下部到上部为y轴正向,垂直于手机屏幕向上为z轴正向
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// x,y,z分别存储坐标轴x,y,z上的加速度
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 根据三个方向上的加速度值得到总的加速度值a
float a = (float) Math.sqrt(x * x + y * y + z * z);
System.out.println("a---------->" + a);
// 传感器从外界采集数据的时间间隔为10000微秒
System.out.println("magneticSensor.getMinDelay()-------->" + mAccelerometerSensor.getMinDelay());
// 加速度传感器的最大量程
System.out.println("event.sensor.getMaximumRange()-------->"
+ event.sensor.getMaximumRange());
System.out.println("ACCx->" + x);
System.out.println("ACCy->" + y);
System.out.println("ACCz->" + z);
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// 三个坐标轴方向上的电磁强度,单位是微特拉斯(micro-Tesla),用uT表示,也可以是高斯(Gauss),1Tesla=10000Gauss
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 手机的磁场感应器从外部采集数据的时间间隔是10000微秒
System.out.println("magneticSensor.getMinDelay()-------->" + mMagneticSensor.getMinDelay());
// 磁场感应器的最大量程
System.out.println("event.sensor.getMaximumRange()----------->" + event.sensor.getMaximumRange());
System.out.println("MAGx->" + x);
System.out.println("MAGy->" + y);
System.out.println("MAGz->" + z);
} else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
// 从 x、y、z 轴的正向位置观看处于原始方位的设备,如果设备逆时针旋转,将会收到正值;否则,为负值
if (timestamp != 0) {
// 得到两次检测到手机旋转的时间差(纳秒),并将其转化为秒
final float dT = (event.timestamp - timestamp) * NS2S;
// 将手机在各个轴上的旋转角度相加,即可得到当前位置相对于初始位置的旋转弧度
angle[0] += event.values[0] * dT;
angle[1] += event.values[1] * dT;
angle[2] += event.values[2] * dT;
// 将弧度转化为角度
float anglex = (float) Math.toDegrees(angle[0]);
float angley = (float) Math.toDegrees(angle[1]);
float anglez = (float) Math.toDegrees(angle[2]);
mShowTextView.setText("Gyroscope #" + "anglex : " + anglex + " : angley : " + angley + " ; anglez :" + anglez);
System.out.println("anglex->" + anglex);
System.out.println("angley->" + angley);
System.out.println("anglez->" + anglez);
System.out.println("gyroscopeSensor.getMinDelay()----------->"
+ mGyroscopeSensor.getMinDelay());
}
// 将当前时间赋值给timestamp,,事件发生在纳秒时间(时间戳)
timestamp = event.timestamp;
}
}
- android 传感器使用与开发----光线传感器
- android 传感器使用与开发----加速度传感器
- android 传感器使用与开发----方向传感器
- android 传感器使用与开发---陀螺仪传感器
- android 传感器使用与开发
- android 传感器使用与开发
- android 传感器使用与开发-补充
- android 传感器使用与开发---温度传感器
- Android 传感器使用与开发-补充2(使用传感器的最佳实践)
- Android特色开发_位置与传感器的使用
- Android 特色开发,使用传感器
- Android 特色开发,使用传感器
- Android开发之方向传感器的使用
- Android开发之方向传感器的使用
- Android开发之方向传感器的使用
- Android开发之方向传感器的使用
- Android传感器的使用开发、简易指南针
- Android传感器的使用开发、简易指南针
- PHP的fsockopen函数详解
- LBP等价模式降维处理
- 网上图书商城视频教程day03
- zeppelin权限问题
- yum安装MySQL,及配置用户和远程登录
- android 传感器使用与开发
- linux shell中的特殊变量
- C#常用函数表
- spark-submit
- 同步阻塞与异步非阻塞适用场景
- C++第3次实验(基础班)—选择结构程序设计(参考答案)-项目4:多分数段函数求值
- 区间覆盖问题 (sdut oj)
- 百度深度学习实验室
- [MySQL] 传输大表的快捷方法--Transportable Tablespace