传感器概览   您所在的位置:网站首页 安卓camera2下载 传感器概览  

传感器概览  

2023-11-20 21:58| 来源: 网络整理| 查看: 265

大多数 Android 设备都有内置传感器,用来测量运动、屏幕方向和各种环境条件。这些传感器能够提供高度精确的原始数据,非常适合用来监测设备的三维移动或定位,或监测设备周围环境的变化。例如,游戏可以跟踪设备重力传感器的读数,以推断出复杂的用户手势和动作,如倾斜、摇晃、旋转或挥动。同样,天气应用可以使用设备的温度传感器和湿度传感器来计算和报告露点,旅行应用则可以使用地磁场传感器和加速度计来报告罗盘方位。

请参阅以下相关资源:

传感器 动态传感器 位置传感器 环境传感器 Accelerometer Play API 演示 (OS - RotationVectorDemo)

Android 平台支持三大类传感器:

动态传感器

这类传感器测量三个轴向上的加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。

环境传感器

这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计。

位置传感器

这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。

您可以利用 Android 传感器框架访问设备上提供的传感器并获取原始传感器数据。传感器框架提供多个类和接口,可帮助您执行各种与传感器相关的任务。例如,您可以使用传感器框架执行以下操作:

确定设备上有哪些传感器。 确定单个传感器的特性,例如最大量程、制造商、功率要求和分辨率。 获取原始传感器数据并定义获取传感器数据的最低频率。 注册和取消注册用于监控传感器变化的传感器事件监听器。

本主题简要介绍 Android 平台所支持的传感器以及传感器框架。

传感器简介

利用 Android 传感器框架,您可以访问多种类型的传感器。有些传感器基于硬件,有些基于软件。基于硬件的传感器是内置在手机或平板设备中的物理组件。这类传感器通过直接测量特定的环境属性(如加速度、地磁场强度或角度变化)来采集数据。基于软件的传感器不是物理设备,它们只是模仿基于硬件的传感器。基于软件的传感器从一个或多个基于硬件的传感器获取数据,有时被称为虚拟传感器或合成传感器。比如线性加速度传感器和重力传感器就是基于软件的传感器。表 1 总结了 Android 平台支持的传感器。

很少有 Android 设备拥有所有类型的传感器。例如,大多数手机设备和平板电脑都有加速度计和磁力计,但很少有气压计或温度计。此外,一个设备可以有多个特定类型的传感器。例如,一个设备可以有两个重力传感器,分别具有不同的量程。

表 1. Android 平台支持的传感器类型。

传感器 类型 说明 常见用途 TYPE_ACCELEROMETER 硬件 测量在所有三个物理轴向(x、y 和 z)上施加在设备上的加速力(包括重力),以 m/s2 为单位。 动态检测(摇晃、倾斜等)。 TYPE_AMBIENT_TEMPERATURE 硬件 以摄氏度 (°C) 为单位测量环境室温。请参见下面的备注。 监测气温。 TYPE_GRAVITY 软件或硬件 测量在所有三个物理轴向(x、y、z)上施加在设备上的重力,单位为 m/s2。 动态检测(摇晃、倾斜等)。 TYPE_GYROSCOPE 硬件 测量设备在三个物理轴向(x、y 和 z)上的旋转速率,以 rad/s 为单位。 旋转检测(旋转、转动等)。 TYPE_LIGHT 硬件 测量环境光级(照度),以 lx 为单位。 控制屏幕亮度。 TYPE_LINEAR_ACCELERATION 软件或硬件 测量在所有三个物理轴向(x、y 和 z)上施加在设备上的加速力(不包括重力),以 m/s2 为单位。 监测单个轴向上的加速度。 TYPE_MAGNETIC_FIELD 硬件 测量所有三个物理轴向(x、y、z)上的环境地磁场,以 μT 为单位。 创建罗盘。 TYPE_ORIENTATION 软件 测量设备围绕所有三个物理轴(x、y、z)旋转的度数。从 API 级别 3 开始,您可以结合使用重力传感器、地磁场传感器和 getRotationMatrix() 方法来获取设备的倾角矩阵和旋转矩阵。 确定设备位置。 TYPE_PRESSURE 硬件 测量环境气压,以 hPa 或 mbar 为单位。 监测气压变化。 TYPE_PROXIMITY 硬件 测量物体相对于设备显示屏幕的距离,以 cm 为单位。该传感器通常用于确定手机是否被举到人的耳边。 通话过程中手机的位置。 TYPE_RELATIVE_HUMIDITY 硬件 测量环境的相对湿度,以百分比 (%) 表示。 监测露点、绝对湿度和相对湿度。 TYPE_ROTATION_VECTOR 软件或硬件 通过提供设备旋转矢量的三个元素来检测设备的屏幕方向。 动态检测和旋转检测。 TYPE_TEMPERATURE 硬件 测量设备的温度,以摄氏度 (°C) 为单位。该传感器的实现因设备而异。在 API 级别 14 中,该传感器已被 TYPE_AMBIENT_TEMPERATURE 传感器取代 监测温度。 传感器框架

您可以利用 Android 传感器框架来访问这些传感器并获取传感器的原始数据。传感器框架是 android.hardware 软件包的一部分,包含了以下类和接口:

SensorManager 您可以使用这个类来创建传感器服务的实例。该类提供了各种方法来访问和列出传感器,注册和取消注册传感器事件监听器,以及获取屏幕方向信息。它还提供了几个传感器常量,用于报告传感器精确度,设置数据采集频率和校准传感器。 Sensor 您可以使用这个类来创建特定传感器的实例。该类提供了各种方法来确定传感器的特性。 SensorEvent 系统使用这个类来创建传感器事件对象,该对象提供有关传感器事件的信息。传感器事件对象中包含以下信息:原始传感器数据、生成事件的传感器类型、数据的准确度和事件的时间戳。 SensorEventListener 您可以使用此接口创建两种回调方法,以在传感器值或传感器精确度发生变化时接收通知(传感器事件)。

在典型的应用中,您可以使用这些与传感器相关的 API 来执行两个基本任务:

识别传感器和传感器特性

如果应用具有依赖于特定传感器类型或特性的功能,则在运行时识别传感器和传感器特性非常有用。例如,您可能希望识别设备上的所有传感器,以便于停用依赖于不存在的传感器的应用功能。同样,您可能希望识别特定类型的所有传感器,以便选择可以为应用带来最佳性能的传感器实现。

监控传感器事件

您可以通过监控传感器事件来获取原始传感器数据。每当传感器检测到它所测量的参数发生变化时,就会发生传感器事件。传感器事件为您提供 4 项信息:触发事件的传感器的名称、事件的时间戳、事件的准确度以及触发事件的原始传感器数据。

传感器可用性

传感器的可用性不仅取决于设备,还取决于 Android 版本。这是因为 Android 传感器的引入历经了多个平台版本。例如,许多传感器是在 Android 1.5(API 级别 3)中引入的,但有些传感器直到 Android 2.3(API 级别 9)才实现并可供使用。同样,在 Android 2.3(API 级别 9)和 Android 4.0(API 级别 14)中也引入了几个传感器。有两个传感器已被弃用,并由更新、更好的传感器取代。

表 2 总结了每个传感器在不同平台上的可用性。这里仅列出了 4 个平台,因为只有这些平台涉及到传感器更改。被列为弃用的传感器仍可在后续平台上使用(前提是设备上有相关传感器),这符合 Android 的向前兼容性政策。

表 2. 传感器在不同平台上的可用性。

传感器 Android 4.0 (API 级别 14) Android 2.3 (API 级别 9) Android 2.2(API 级别 8) Android 1.5 (API 级别 3) TYPE_ACCELEROMETER 可用 可用 可用 可用 TYPE_AMBIENT_TEMPERATURE 可用 不可用 不可用 不可用 TYPE_GRAVITY 可用 可用 不可用 不可用 TYPE_GYROSCOPE 可用 可用 不可用1 不可用1 TYPE_LIGHT 可用 可用 可用 可用 TYPE_LINEAR_ACCELERATION 可用 可用 不可用 不可用 TYPE_MAGNETIC_FIELD 可用 可用 可用 可用 TYPE_ORIENTATION 可用2 可用2 可用2 可用 TYPE_PRESSURE 可用 可用 不可用1 不可用1 TYPE_PROXIMITY 可用 可用 可用 可用 TYPE_RELATIVE_HUMIDITY 可用 不可用 不可用 不可用 TYPE_ROTATION_VECTOR 可用 可用 不可用 不可用 TYPE_TEMPERATURE 可用2 可用 可用 可用

1 此传感器类型是在 Android 1.5(API 级别 3)中添加的,但直到 Android 2.3(API 级别 9)才可供使用。

2 此传感器可用,但已被弃用。

识别传感器和传感器特性

Android 传感器框架提供了几个方法,可让您在运行时轻松确定设备上有哪些传感器。该 API 还提供了相关方法来确定每个传感器的特性,例如最大量程、分辨率和功率要求。

要识别设备上的传感器,您首先需要获得对传感器服务的引用。为此,您可以调用 getSystemService() 方法并传入 SENSOR_SERVICE 参数来创建 SensorManager 类的实例。例如:

Kotlin private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager Java private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

接下来,您可以调用 getSensorList() 方法并使用 TYPE_ALL 常量来获取设备上每种传感器的列表。例如:

Kotlin val deviceSensors: List = sensorManager.getSensorList(Sensor.TYPE_ALL) Java List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

如果您想列出特定类型的所有传感器,可以使用其他常量来代替 TYPE_ALL,例如 TYPE_GYROSCOPE、TYPE_LINEAR_ACCELERATION 或 TYPE_GRAVITY。

您还可以使用 getDefaultSensor() 方法并传入特定传感器的类型常量,来确定设备上是否存在相关类型的传感器。如果设备上有多个特定类型的传感器,则必须将其中一个指定为默认传感器。如果没有指定默认传感器,则该方法调用会返回 null,这表示设备没有该类型的传感器。例如,以下代码会检查设备上是否有磁力计:

Kotlin private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) { // Success! There's a magnetometer. } else { // Failure! No magnetometer. } Java private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }

注意:Android 对于设备制造商在其 Android 设备中内置的传感器类型没有特殊要求,因此设备可以采用各种传感器配置。

除了列出设备上的传感器之外,您还可以使用 Sensor 类的公共方法确定单个传感器的功能和属性。如果您希望应用根据设备上可用的传感器或传感器功能表现出不同的行为,这会非常有用。例如,您可以使用 getResolution() 和 getMaximumRange() 方法来获得传感器的分辨率和最大量程。您也可以使用 getPower() 方法来获得传感器的电源要求。

如果您希望针对不同制造商的传感器或传感器的不同版本优化您的应用,有两种公共方法特别有用。例如,如果您的应用需要监控用户手势(例如倾斜和摇晃),您可以针对带有特定供应商的重力传感器的新款设备创建一组数据过滤规则和优化配置,而针对没有重力传感器、只有加速度计的设备创建另一组数据过滤规则和优化配置。以下代码示例展示了如何使用 getVendor() 和 getVersion() 方法来执行此操作。在本例中,我们要查找一个将 Google LLC 列为供应商、版本号为 3 的重力传感器。如果设备上没有该传感器,我们会尝试使用加速度计。

Kotlin private lateinit var sensorManager: SensorManager private var mSensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) { val gravSensors: List = sensorManager.getSensorList(Sensor.TYPE_GRAVITY) // Use the version 3 gravity sensor. mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 } } if (mSensor == null) { // Use the accelerometer. mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) } else { // Sorry, there are no accelerometers on your device. // You can't play this game. null } } Java private SensorManager sensorManager; private Sensor mSensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = null; if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有