安卓各种传感器的使用

这段时间研究安卓上的各种传感器,然后这里做个总结

1.加速度传感器

2.磁场传感器

3.方向传感器

4.陀螺仪传感器

5.重力传感器

6.线性加速度传感器

7.温度传感器

8.光线传感器

9.距离传感器

10.压力传感器

11.计步传感器

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

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

SensorManager mSensorManager;
List sensorList;
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到设置支持的所有传感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List sensorNameList = new ArrayList();
for (Sensor sensor : sensorList) {
    Log.d(TAG, "onResume: "+sensor.getName());
}
我使用的是小米4,下面是该手机的sensor信息,接下来会一个个分析

安卓各种传感器的使用_第1张图片

1.加速度传感器

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

安卓各种传感器的使用_第2张图片

首先先创建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渣渣。其实这个传感器非常敏感,数值是一直在变化的

安卓各种传感器的使用_第3张图片

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

安卓各种传感器的使用_第4张图片

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 );
}
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 );
}
所有代码

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private TextView mtextViewx;
    private TextView mtextViewy;
    private TextView mtextViewz;
    private TextView mtextViewlx;
    private TextView mtextViewly;
    private TextView mtextViewlz;
    private TextView mtextViewgx;
    private TextView mtextViewgy;
    private TextView mtextViewgz;
    private TextView mtextView1;
    private TextView mtextView2;
    private TextView mtextView3;
    private TextView mtextView4;
    private TextView mtextView5;
    private TextView mtextView6;
    private TextView mtextView7;
    private TextView mtextView8;
    private TextView mtextView9;
    private TextView mtextView10;
    private TextView mtextView11;
    private TextView mtextView12;
    private TextView mtextView13;
    private TextView mtextView14;
    private TextView mtextView15;
    private SensorManager sm;
    private static final String TAG = "sensor";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniView();
    }

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

    public void iniView() {
        mtextViewx = (TextView) findViewById(R.id.textViewx);
        mtextViewy = (TextView) findViewById(R.id.textViewy);
        mtextViewz = (TextView) findViewById(R.id.textViewz);
        mtextViewlx = (TextView) findViewById(R.id.textViewlx);
        mtextViewly = (TextView) findViewById(R.id.textViewly);
        mtextViewlz = (TextView) findViewById(R.id.textViewlz);
        mtextViewgx = (TextView) findViewById(R.id.textViewgx);
        mtextViewgy = (TextView) findViewById(R.id.textViewgy);
        mtextViewgz = (TextView) findViewById(R.id.textViewgz);
        mtextView1 = (TextView) findViewById(R.id.textView1);
        mtextView2 = (TextView) findViewById(R.id.textView2);
        mtextView3 = (TextView) findViewById(R.id.textView3);
        mtextView4 = (TextView) findViewById(R.id.textView4);
        mtextView5 = (TextView) findViewById(R.id.textView5);
        mtextView6 = (TextView) findViewById(R.id.textView6);
        mtextView7 = (TextView) findViewById(R.id.textView7);
        mtextView8 = (TextView) findViewById(R.id.textView8);
        mtextView9 = (TextView) findViewById(R.id.textView9);
        mtextView10 = (TextView) findViewById(R.id.textView10);
        mtextView11 = (TextView) findViewById(R.id.textView11);
        mtextView12 = (TextView) findViewById(R.id.textView12);
        mtextView13 = (TextView) findViewById(R.id.textView13);
        mtextView14 = (TextView) findViewById(R.id.textView14);
        mtextView15 = (TextView) findViewById(R.id.textView15);
    }

    public void setSensor() {
        //创建一个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);
        // 为磁场传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
        // 为方向传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
        // 为陀螺仪传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
        // 为重力传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_NORMAL);
        // 为线性加速度传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_NORMAL);
        // 为温度传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_NORMAL);
        Sensor tempertureSensor = sm.getDefaultSensor(Sensor.TYPE_PRESSURE);
//        if (tempertureSensor == null) {
//            Toast.makeText(this, "你的设备不支持该功能", 0).show();
//        }
        // 为光传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL);
        // 为距离传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL);
        // 为压力传感器注册监听器
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_NORMAL);
        // 计步统计
        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);
    }

    @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 + "");
        }
        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 );
        }
        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 );
        }
        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 );
        }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 );
        }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 );
        }else if(sensorEvent.sensor.getType() == Sensor.TYPE_TEMPERATURE){
            float X = sensorEvent.values[0];
            mtextView10.setText("温度为"+ X );
        }else if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
            float X = sensorEvent.values[0];
            mtextView11.setText("光强度为为"+ X );
        }else if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY){
            float X = sensorEvent.values[0];
            mtextView12.setText("距离为"+ X );
        }else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE){
            float X = sensorEvent.values[0];
            mtextView13.setText("压强为"+ X );
        }
        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 );
        }
    }

    //复写onAccuracyChanged方法
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        Log.i(TAG, "onAccuracyChanged");
    }

    @Override
    public void onPause() {
        sm.unregisterListener(this);
        super.onPause();
    }
}





你可能感兴趣的:(android)