• 【Android】Android传感器


    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信息,接下来会一个个分析

    1.加速度传感器

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


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


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

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

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

  • 相关阅读:
    eclipse中打断点debug无效
    Jenkins构建部署Maven项目
    自动生成实体类和xml
    session 控制单点登录
    eclipse team 没有svn
    easyui combobox 设置滚动条
    unkow jdbc driver : http://maven.apache.org
    easyui datagrid列显示图片
    mysql中计算日期整数差
    Map<String, Object>转Object,Object转 Map<String, Object>
  • 原文地址:https://www.cnblogs.com/HDK2016/p/9596724.html
Copyright © 2020-2023  润新知