【Android】Android传感器 1.加速度传感器 2.磁场传感器 3.方向传感器 4.陀螺仪传感器 5.重力传感器 6.线性加速度传感器 7.温度传感器 8.光传感器 9.距离传感器 10.压力传感器 11.计步传感器

1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光线传感器
9.距离传感器
10.压力传感器
11.计步传感器

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

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

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());
}

我使用的是小米4,下面是该手机的sensor信息,接下来会一个个分析
【Android】Android传感器
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光传感器
9.距离传感器
10.压力传感器
11.计步传感器

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

【Android】Android传感器
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光传感器
9.距离传感器
10.压力传感器
11.计步传感器
首先先创建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 + "");
    }
}

可以看到放在桌子上的时候x和y轴的加速度几乎为0,我手机不太平,而z轴的加速度接近9.8,换了小米note2测出来就是9.8,米4渣渣。其实这个传感器非常敏感,数值是一直在变化的
【Android】Android传感器
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光传感器
9.距离传感器
10.压力传感器
11.计步传感器

在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轴的磁场强度
"+ X_lateral );
    mtextView2.setText("y轴的磁场强度
"+ Y_longitudinal );
    mtextView3.setText("z轴的磁场强度
"+ Z_vertical );
}

【Android】Android传感器
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光传感器
9.距离传感器
10.压力传感器
11.计步传感器

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轴转过的角度
"+ X_lateral );
    mtextView5.setText("绕x轴转过的角度
"+ Y_longitudinal );
    mtextView6.setText("绕y轴转过的角度
"+ 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轴转过的角速度
"+ X );
    mtextView8.setText("绕y轴转过的角速度
"+ Y );
    mtextView9.setText("绕z轴转过的角速度
"+ 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方向的重力加速度
"+ X );
    mtextViewgy.setText("Y方向的重力加速度
"+ Y );
    mtextViewgz.setText("Z方向的重力加速度
"+ 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方向的线性加速度
"+ X );
    mtextViewly.setText("Y方向的线性加速度
"+ Y );
    mtextViewlz.setText("Z方向的线性加速度
"+ Z );
}

7.温度传感器

这里的TYPE_TEMPERATURE已经过时,测出来的是cpu的温度,所以测出来的数值有点大,如果测环境温度的话应该使用

TYPE_AMBIENT_TEMPERATURE。不过大部分手机都没有这个传感器,小米note2居然连前面那个都没有

// 为温度传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_NORMAL);
Sensor tempertureSensor = sm.getDefaultSensor(Sensor.TYPE_PRESSURE);

else if(sensorEvent.sensor.getType() == Sensor.TYPE_TEMPERATURE){
    float X = sensorEvent.values[0];
    mtextView10.setText("温度为"+ X );
}

8.光传感器

// 为光传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL);

else if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
    float X = sensorEvent.values[0];
    mtextView11.setText("光强度为为"+ X );
}

9.距离传感器

可以控制手机打电话时候息屏,如果使用光线传感器的话在黑夜中打电话就自动息屏了

// 为距离传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL);

else if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY){
    float X = sensorEvent.values[0];
    mtextView12.setText("距离为"+ X );
}

10.压力传感器

// 为压力传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_NORMAL);

else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE){
    float X = sensorEvent.values[0];
    mtextView13.setText("压强为"+ X );
}

11.计步传感器

有两个接口,一个Counter统计的是总步数,而DETECTOR为该计步是否有效,有效的话就置1

// 计步统计
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_NORMAL);
// 单次计步
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR), SensorManager.SENSOR_DELAY_NORMAL);

else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER){
    float X = sensorEvent.values[0];
    mtextView14.setText("COUNTER:"+ X );
} else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){
    float X = sensorEvent.values[0];
    mtextView15.setText("DECTOR:"+ X );
}

原文链接:安卓各种传感器的使用