Android传感器Sensor了解一下

QuibblerQuibbler 2020-01-15 约 11 分钟 2761 次阅读

        Sensor

Android设备支持种类众多的传感器,诸如光线传感器、加速度传感器、磁场传感器、压力传感器等等。应用场景很丰富,比如用在手机自动调整亮度、游戏里的方向控制等等。

1、SensorManager

传感器管理类,管理手机上的各种传感器。这个类提供的各种方法可以访问传感器列表、注册或解除注册传感器事件监听、获取方位信息等。通过getSystemService()获取SensorManager实例:

SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

官方文档关于SensorManager的部分说明“SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。”

2、Sensor传感器

这个类提供的方法可以让你决定一个传感器的功能,通过SensorManager实例可以获取到指定TYPE的传感器实例。举个例子,获取光线传感器:

Sensor mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

其它更多Sensor类型可以查看Senor文档与源码:

TYPE_ALL  //用于列出所有感应器
    
    TYPE_ACCELEROMETER         //三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
    TYPE_GRAVITY               //重力感应器
    TYPE_GYROSCOPE             //陀螺仪 可判断方向 返回三个坐标轴上的角度
    TYPE_LIGHT                 //光线感应器 单位 lux 勒克斯
    TYPE_LINEAR_ACCELERATION   //线性加速度
    TYPE_MAGNETIC_FIELD        //磁场感应 返回三个坐标轴的数值 微特斯拉
    TYPE_ORIENTATION           //方向感应器 已过时 可以使用方法获得
    TYPE_PRESSURE              //压力感应器 单位 千帕斯卡
    TYPE_PROXIMITY             //距离传感器
    TYPE_ROTATION_VECTOR       //翻转传感器
    TYPE_TEMPERATURE           //温度传感器 单位 摄氏度

如果不知道手机有哪些传感器,使用Sensor.TYPE_ALL,可以获取手机所有传感器的集合。

List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);

打印集合可以看到我手机上的传感器一共有,部分如下:

... ...
    {Sensor name="win_orient  Non-wakeup", vendor="vivo", version=1, type=66537, maxRange=1.0, resolution=0.1, power=0.001, minDelay=0}

    {Sensor name="sns_tilt  Wakeup", vendor="qualcomm", version=1, type=22, maxRange=1.0, resolution=1.0, power=0.025, minDelay=0}

    {Sensor name="pedometer  Non-wakeup", vendor="vivo", version=1, type=18, maxRange=1.0, resolution=1.0, power=0.001, minDelay=0}

    {Sensor name="pedometer  Non-wakeup", vendor="vivo", version=1, type=19, maxRange=4.2949673E9, resolution=1.0, power=0.001, minDelay=0}

    {Sensor name="stationary_detect", vendor="qualcomm", version=1, type=29, maxRange=1.0, resolution=1.0, power=0.025, minDelay=-1}

    {Sensor name="sns_smd  Wakeup", vendor="qualcomm", version=1, type=17, maxRange=1.0, resolution=1.0, power=0.025, minDelay=-1}
    ... ...

3、SensorEventListener

获取到SensorManager和传感器Sensor的实例之后,还需要注册一个传感器事件监听器,定义如下,需要实现onAccuracyChanged,onSensorChanged这两个方法:

private SensorEventListener mSensorEventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            //传感器事件值改变时的回调接口:执行此方法的频率与注册传感器时的频率有关
        }
        
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            //传感器精度发生改变时做些操作,accuracy为当前传感器精度
        }
    };

在onResume()中给指定的Sensor注册传感器监听器:

/*
     *第一个参数:SensorEventListener接口的实例对象
     *第二个参数:需要注册的传感器实例
     *第三个参数:传感器获取传感器事件event值频率:
     *            SensorManager.SENSOR_DELAY_FASTEST = 0:对应0微秒的更新间隔,最快,1微秒 = 1 % 1000000秒
     *            SensorManager.SENSOR_DELAY_GAME = 1:对应20000微秒的更新间隔,游戏中常用
     *            SensorManager.SENSOR_DELAY_UI = 2:对应60000微秒的更新间隔
     *            SensorManager.SENSOR_DELAY_NORMAL = 3:对应200000微秒的更新间隔
     *            键入自定义的int值x时:对应x微秒的更新间隔
     */
    mSensorManager.registerListener(mSensorEventListener, mLightSensor, SensorManager.SENSOR_DELAY_NORMAL)

在onPause()中反注册,否则后台一直监听会非常耗电:

mSensorManager.unregisterListener(mSensorEventListener);

大部分传感器会返回三个轴方向x,y,x的event值,值的意义因传感器而异。在SensorEventListener中的onSensorChanged()获取变化的值:

@Override
    public void onSensorChanged(SensorEvent event) {
        float[] values = event.values;
        float x = values[0];
        float y = values[1];
        float z = values[2];
        //... ...
    }

4、几种常用Sensor

简单介绍了解一下绝大多数手机都有的传感器,也是比较常用的。更多详细介绍参考官方文档。引用博客《Android Sensor传感器总结》

4.1、Accelerometer 加速度传感器

加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。

将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。 将手机朝下放在桌面上,z轴为-9.81。 将手机向左倾斜,x轴为正值。 将手机向右倾斜,x轴为负值。 将手机向上倾斜,y轴为负值。 将手机向下倾斜,y轴为正值。

4.2、Ambient Light Sensor (环境)光线感应传感器

光线感应传感器检测实时的光线强度,光强单位是lux(勒克司度),其物理意义是照射到单位面积上的光通量。光线感应传感器主要用于Android系统的LCD自动亮度功能。可以根据采样到的光强数值实时调整LCD的亮度。

4.3、Step Detector 步数探测器、Step Counter 计步器

就是手机计步用的,APP诸如KEEP都有自己的复杂算法去优化底层的数据,更加准确的计算用户的步数。

5、结束

Android为我们提供了方便的API去获取和控制各种硬件层的传感器。与其只是简单的调用一个API,更多需要了解这些底层的运作,架构设计。还有业务、算法、场景的应用。有时间的话看看下面两篇非常不错的博客,也可以自己抽空看看源码和Android官方API文档。

《Android Sensor架构和原理分析》

《Android Sensor传感器总结》

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w