Android NDK开发详解传感器之环境传感器

Android NDK开发详解传感器之环境传感器

Android 平台提供四种传感器,用来监控各种环境属性。您可以使用这些传感器来监控 Android 设备附近的相对环境湿度、照度、环境压力和环境温度。四种环境传感器都基于硬件,要使用它们,设备制造商必须将其内置到设备中。大多数设备制造商都会使用光传感器来控制屏幕亮度,除此之外,设备上并不一定具备环境传感器。因此,请务必在运行时验证环境传感器是否存在,然后再尝试从中获取数据。

大多数动态传感器和位置传感器会为每个 SensorEvent 返回传感器值的多维数组,而与之不同的是,环境传感器只为每个数据事件返回一个传感器值。例如,以°C 为单位的温度或以 hPa 为单位的压力。此外,动态传感器和位置传感器通常需要高通或低通滤波,而环境传感器一般不需要任何数据滤波或数据处理。表 1 总结了 Android 平台支持的环境传感器。

表 1. Android 平台支持的环境传感器。
在这里插入图片描述

1 不同设备具有不同的实现。此传感器已在 Android 4.0(API 级别 14)中弃用。

使用光、压力和温度传感器

从光、压力和温度传感器获取的原始数据通常不需要校准、滤波或修改,因此它们是一些最容易使用的传感器。要从这些传感器获取数据,您需要先创建 SensorManager 类的实例,并用它来获取物理传感器的实例。然后,在 onResume() 方法中注册传感器监听器,并开始在 onSensorChanged() 回调方法中处理传入的传感器数据。以下代码说明了如何执行此操作:
Kotlin

    class SensorActivity : Activity(), SensorEventListener {

        private lateinit var sensorManager: SensorManager
        private var pressure: Sensor? = null

        public override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.main)

            // Get an instance of the sensor service, and use that to get an instance of
            // a particular sensor.
            sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
            pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)
        }

        override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
            // Do something here if sensor accuracy changes.
        }

        override fun onSensorChanged(event: SensorEvent) {
            val millibarsOfPressure = event.values[0]
            // Do something with this sensor data.
        }

        override fun onResume() {
            // Register a listener for the sensor.
            super.onResume()
            sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL)
        }

        override fun onPause() {
            // Be sure to unregister the sensor when the activity pauses.
            super.onPause()
            sensorManager.unregisterListener(this)
        }
    }

Java

public class SensorActivity extends Activity implements SensorEventListener {
        private SensorManager sensorManager;
        private Sensor pressure;

        @Override
        public final void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);

          // Get an instance of the sensor service, and use that to get an instance of
          // a particular sensor.
          sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
          pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
        }

        @Override
        public final void onAccuracyChanged(Sensor sensor, int accuracy) {
          // Do something here if sensor accuracy changes.
        }

        @Override
        public final void onSensorChanged(SensorEvent event) {
          float millibarsOfPressure = event.values[0];
          // Do something with this sensor data.
        }

        @Override
        protected void onResume() {
          // Register a listener for the sensor.
          super.onResume();
          sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL);
        }

        @Override
        protected void onPause() {
          // Be sure to unregister the sensor when the activity pauses.
          super.onPause();
          sensorManager.unregisterListener(this);
        }
    }

您必须始终包含 onAccuracyChanged() 和 onSensorChanged() 两种回调方法的实现。此外,请确保始终在 Activity 暂停时取消注册传感器。这可防止传感器持续感应数据并消耗电池电量。

使用湿度传感器

您可以使用湿度传感器获取原始相对湿度数据,就像使用光、压力和温度传感器一样。但是,如果设备既有湿度传感器 (TYPE_RELATIVE_HUMIDITY),也有温度传感器 (TYPE_AMBIENT_TEMPERATURE),您可以使用这两个数据流来计算露点和绝对湿度。
露点

露点是指在恒定气压下,一定体积的空气使水蒸气凝结成水而必须冷却到的温度。露点的计算公式如下所示:
在这里插入图片描述

其中:

td = 以摄氏度为单位的露点温度
t = 以摄氏度为单位的实际温度
RH = 以百分比 (%) 表示的实际相对湿度
m = 17.62
Tn = 243.12

绝对湿度

绝对湿度是一定体积的干燥空气中的水蒸气质量。绝对湿度以克/米3 为度量单位。绝对湿度的计算公式如下所示:
在这里插入图片描述

其中:

dv = 以克/米3 为单位的绝对湿度
t = 以摄氏度为单位的实际温度
RH = 以百分比 (%) 表示的实际相对湿度
m = 17.62
Tn = 243.12 摄氏度
A = 6.112 hPa

另请阅读

传感器
传感器概览
位置传感器
动态传感器
AccelerometerPlay 示例

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2019-12-27。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值