Android 开发必备

传感器的介绍

2019-05-07  本文已影响7人  总会颠沛流离

今天面试,突然有需求是通过记录步数来达到领取优惠劵的目的(计步传感器),顿时我就懵比了,虽然会点,之前项目中很少用到。我现在就带领大家了解了解,有不对的地方多多指教。

记住在学习中,难免会碰到一些困难,给我们带来烦恼。成绩较差,虽然自己努力了,却总不见效;练习立定跳远,却总是跳不过那根优秀线……这样的例子有很多。当我们遇到这些困难时,该拥用怎样的心态?我们“班务栏”里“班级目标”后写着一句话:“每天进步一点”。我们就是要抱着这种良好的心态,努力学习,争取每天进步一点。

传感器的使用

1.加速度传感器

2.磁场传感器

3.方向传感器

4.陀螺仪传感器

5.重力传感器

6.线性加速度传感器

7.温度传感器

8.光线传感器

9.距离传感器

10.压力传感器

11.计步传感器

1. 首先先查看测试的安卓机拥有的传感器

这里先初始化一个SensorManager的对象,然后把所有支持的sensor类型log日志打印出来看看。

SensorManager mSensorManager;
List<Sensor> sensorList;
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到设置支持的所有传感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List<String> sensorNameList = new ArrayList<String>();
for (Sensor sensor : sensorList) {
Log.d(TAG, "onResume: "+sensor.getName());
}

下面为大家一一介绍

1.加速度传感器

在这这之前先了解一下手机传感器世界的三维坐标

image

首先先创建3个textView来显示三个方向上的加速度。

先给Activity实现SensorEventListener接口,后面要不断要监听来刷新数据

 public class MainActivity extends AppCompatActivity implements 
 SensorEventListener {
 然后创建SensorManager对象,如果前面设置过就不用设置,然后为它注册加速度传感器监
听器,采样频率可以自己设置,一般越高越精准但是越耗电
private SensorManager sm;
//创建一个SensorManager来获取系统的传感器服务
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/*
* 最常用的一个方法 注册事件
* 参数1 :SensorEventListener监听器
 * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的
Sensor
 * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
 * */
 //加速度传感器
 sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
  SensorManager.SENSOR_DELAY_NORMAL);
  接下来我们只要监听这个传感器值的变化,然后更新textView的值就好了
 @Override
 public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    float X_lateral = sensorEvent.values[0];
    float Y_longitudinal = sensorEvent.values[1];
    float Z_vertical = sensorEvent.values[2];
    mtextViewx.setText(X_lateral + "");
    mtextViewy.setText(Y_longitudinal + "");
    mtextViewz.setText(Z_vertical + "");
}

}


image

结果:可以看到放在桌子上的时候x和y轴的加速度几乎为0,我手机不太平,而z轴的加速度接近9.8
在activity变为不可见的时候,传感器依然在工作,这样很耗电,所以我们根据需求可以在onPause方法里面停掉传感器的工作

@Override
public void onPause() {
sm.unregisterListener(this);
super.onPause();
}
2.磁场传感器

和加速度计一样,为sensormanager监听磁场变化即可,吧手机放在电脑旁边时候可以清楚看到数值的变化

 // 为磁场传感器注册监听器
 sm.registerListener(this, 
 sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
 SensorManager.SENSOR_DELAY_NORMAL);
 else if(sensorEvent.sensor.getType() == 
 Sensor.TYPE_MAGNETIC_FIELD){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView1.setText("x轴的磁场强度\n"+ X_lateral );
mtextView2.setText("y轴的磁场强度\n"+ Y_longitudinal );
mtextView3.setText("z轴的磁场强度\n"+ Z_vertical );
 }
image

3.方向传感器

这个可以用来做指南针之类的,绕z轴转过的角度为0时大概指向正北。这个TYPE_ORIENTATION接口不够精确已经过时了,可以使用旋转矩阵来代替。这里绕z轴转过的角度是value[0],

详情看这个博客点击打开链接

// 为方向传感器注册监听器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == 
Sensor.TYPE_ORIENTATION){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView4.setText("绕z轴转过的角度\n"+ X_lateral );
mtextView5.setText("绕x轴转过的角度\n"+ Y_longitudinal );
mtextView6.setText("绕y轴转过的角度\n"+ Z_vertical );
}

4.陀螺仪传感器

// 为陀螺仪传感器注册监听器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 
 SensorManager.SENSOR_DELAY_NORMAL);
 else if(sensorEvent.sensor.getType() == 
 Sensor.TYPE_GYROSCOPE){
//需要将弧度转为角度
float X = (float)Math.toDegrees(sensorEvent.values[0]);
float Y = (float)Math.toDegrees(sensorEvent.values[1]);
float Z = (float)Math.toDegrees(sensorEvent.values[2]);
mtextView7.setText("绕x轴转过的角速度\n"+ X );
mtextView8.setText("绕y轴转过的角速度\n"+ Y );
mtextView9.setText("绕z轴转过的角速度\n"+ Z );

5.重力传感器
就是把重力加速度分解到xyz三个方向上

// 为重力传感器注册监听器
sm.registerListener(this, 
sm.getDefaultSensor(Sensor.TYPE_GRAVITY), 
SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewgx.setText("x方向的重力加速度\n"+ X );
mtextViewgy.setText("Y方向的重力加速度\n"+ Y );
mtextViewgz.setText("Z方向的重力加速度\n"+ Z );

6.线性加速度传感器
就是去掉重力加速度后各个方向的加速度

// 为线性加速度传感器注册监听器
 sm.registerListener(this, 
 sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), 
 SensorManager.SENSOR_DELAY_NORMAL);
else if(sensorEvent.sensor.getType() == 
Sensor.TYPE_LINEAR_ACCELERATION){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewlx.setText("x方向的线性加速度\n"+ X );
mtextViewly.setText("Y方向的线性加速度\n"+ Y );
mtextViewlz.setText("Z方向的线性加速度\n"+ Z );

}

上一篇 下一篇

猜你喜欢

热点阅读