传感器

作者: 君袅 | 来源:发表于2019-03-21 08:15 被阅读0次

    知识要点:

    1 传感器的简介及分类

    1.1传感器的概述及应用场景
    1.2传感器分类介绍

    2 方向传感器获取参数的实现

    2.1 SensorEvent类
    2.2 SensorEventListener接口
    2.3 SensorManager
    2.4 每种传感器对应的常量值

    案例:微信摇一摇、指南针

    一.Android的三大类传感器

    Android传感器按大方向划分大致有这么三类传感器:动作(Motion)传感器、环境(Environmental)传感器、位置(Position)传感器。

    (1)动作传感器

    这类传感器在三个轴(x、y、z)上测量加速度和旋转角度。包括如下几个传感器:
    加速(accelerometer)传感器、重力(gravity)传感器、陀螺仪(gyroscope)传感器、旋转向量(rotational vector )传感器

    下面来看一下传感器世界的坐标系:


    image.png

    (2)环境传感器

    这类传感器可以测量不同环境的参数,例如,周围环境的空气温度和压强、光照强度和湿度。包括如下几个传感器:
    湿度(barometer)传感器、光线(photometer)传感器、温度(thermometer)传感器

    (3)位置传感器

    这类传感器可以测量设备的物理位置。包括如下几个传感器:
    方向(orientation)传感器、磁力(magnetometer)传感器
    了解后我们就开始进入传感器的编程工作了,接下来我们看一下Android为我们提供的传感器框架(Android sensor framework,简称ASF)。

    二.Android传感器框架

    Android SDK为我们提供了ASF,可以用来访问当前Android设备内置的传感器。ASF提供了很多类和接口,帮助我们完成各种与传感器有关的任务。例如:
    1)确定当前Android设备内置了哪些传感器。
    2)确定某一个传感器的技术指标。
    3)获取传感器传回来的数据,以及定义传感器回传数据的精度。
    4)注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。
    ASF允许我们访问很多传感器类型,这些传感器有一些是基于硬件的传感器,还有一些是基于软件的传感器。基于硬件的传感器就是直接以芯片形式嵌入到Android设备中,这些传感器直接从外部环境获取数据。基于软件的传感器并不是实际的硬件芯片,基于软件的传感器传回的数据本质上也来自于基于硬件的传感器,只是这些数据通常会经过二次加工。所以基于软件的传感器也可以称为虚拟(virtual)传感器或合成(synthetic)传感器。

    Android对每个设备的传感器都进行了抽象,其中SensorManger类用来控制传感器,Sensor用来描述具体的传感器,SensorEventListener用来监听传感器值的改变。

    (1)SensorManager类

    用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。

    (2)Sensor类

    Sensor类为我们提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。例如所有传感器的TYPE类型如下:

    a.png

    (3)SensorEvent类

    系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间

    (4)SensorEventListener接口

    /**
     * 传感器精度变化时回调
     */
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    /**
     * 传感器数据变化时回调
     */
    @Override
    public void onSensorChanged(SensorEvent event) {
    }
    

    三.获取传感器技术参数

    下来我们编写代码来获取一下自己手机的传感器技术参数。

          //获取到传感器
            mManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            List<Sensor> sensorList = mManager.getSensorList(Sensor.TYPE_ALL);
            for (int i = 0; i < sensorList.size(); i++) {
                Sensor sensor = sensorList.get(i);
                Log.d(TAG, "onCreate: " + sensor.getName());
            }
    

    在onStart中注册传感器

        @Override
        protected void onStart() {
            super.onStart();
             /*
            * 最常用的一个方法 注册事件
            * 参数1 :SensorEventListener监听器
            * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
            * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
            * */
            //加速度传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
    
            //方向传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)
                    , SensorManager.SENSOR_DELAY_NORMAL);
    
            //光感传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                    SensorManager.SENSOR_DELAY_NORMAL);
        }
    

    onStop要注销

        @Override
        protected void onStop() {
            super.onStop();
            mManager.unregisterListener(this);
        }
    

    具体代码形式如下一看就懂啦:

    public class MainActivity extends AppCompatActivity implements SensorEventListener {
    
        private static final String TAG = "MainActivity";
        private SensorManager mManager;
        private TextView mTv1;
        private TextView mTv2;
        private TextView mTv3;
        private Vibrator mVibrator;
        private TextView mTv4;
        private TextView mTv5;
        private TextView mTv6;
        private TextView mTv7;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
    
            mManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            List<Sensor> sensorList = mManager.getSensorList(Sensor.TYPE_ALL);
            for (int i = 0; i < sensorList.size(); i++) {
                Sensor sensor = sensorList.get(i);
                Log.d(TAG, "onCreate: " + sensor.getName());
            }
        }
    
        @Override
        protected void onStart() {
            super.onStart();
             /*
            * 最常用的一个方法 注册事件
            * 参数1 :SensorEventListener监听器
            * 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
            * 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
            * */
            //加速度传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
    
            //方向传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)
                    , SensorManager.SENSOR_DELAY_NORMAL);
    
            //光感传感器
            mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                    SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            mManager.unregisterListener(this);
        }
    
        /**
         * 传感器数据变化时回调
         */
        @Override
        public void onSensorChanged(SensorEvent event) {
            //所有的传感器都是通过这个回调方法获取数据
            //event.accuracy 精度
            //event.sensor,传感器的数据
            //event.timestamp,时间戳
            //event.values 值
            Sensor sensor = event.sensor;
            //判断是那种类型的传感器数据
            if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                mTv1.setText("x轴的加速度:" + x);
                mTv2.setText("y轴的加速度:" + y);
                mTv3.setText("z轴的加速度:" + z);
                //摇一摇实现的逻辑
                if (Math.abs(x) > 20 || Math.abs(y) > 20 || Math.abs(z) > 20) {
                    //出发摇一摇功能
                    yaoYiYao();
                }
            } else if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
                //绕z轴转过的角度为0/360时大概指向正北
                float z = event.values[0];
                float x = event.values[1];
                float y = event.values[2];
    
                mTv4.setText("绕z轴转过的角度:" + z);
                mTv5.setText("绕x轴转过的角度:" + x);
                mTv6.setText("绕y轴转过的角度:" + y);
            } else if (sensor.getType() == Sensor.TYPE_LIGHT) {
                float light = event.values[0];
                mTv7.setText("光线强度:"+light);
            }
    
        }
    
        private void yaoYiYao() {
            //音效
            MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.weichat_audio);
            mediaPlayer.start();
    
            //震动
            //获取Vibrator震动服务
            mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            //方式1
            //mVibrator.vibrate(1000);//振动一秒
            //方式2
            //这里使用的是一个长整型数组,数组的a[0]表示静止的时间,
            // a[1]代表的是震动的时间,然后数组的a[2]表示静止的时间,
            // a[3]代表的是震动的时间……依次类推下去,然后这里的代码有一点小小的改变:
            long[] patter = {1000, 1000, 2000, 100};
            mVibrator.vibrate(patter, -1);
        }
    
        /**
         * 传感器精度变化时回调
         */
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    
        private void initView() {
            mTv1 = (TextView) findViewById(R.id.tv1);
            mTv2 = (TextView) findViewById(R.id.tv2);
            mTv3 = (TextView) findViewById(R.id.tv3);
            mTv4 = (TextView) findViewById(R.id.tv4);
            mTv5 = (TextView) findViewById(R.id.tv5);
            mTv6 = (TextView) findViewById(R.id.tv6);
            mTv7 = (TextView) findViewById(R.id.tv7);
        }
    }
    

    相关文章

      网友评论

          本文标题:传感器

          本文链接:https://www.haomeiwen.com/subject/vksfvqtx.html