Android 传感器概述(一)

news2024/11/20 2:29:19

Android 传感器概述(一)

  • Android 传感器概述(一)
    • 传感器简介
      • 传感器框架
    • 识别传感器和传感器特性
    • 监控传感器事件
    • 处理不同的传感器配置
      • 在运行时检测传感器
      • 使用 Google Play 过滤器定位特定的传感器配置
    • 传感器坐标系

Android 传感器概述(一)

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

Android 平台支持三大类传感器

  • 动态传感器
    这类传感器测量三个轴向上的加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。
  • 环境传感器
    这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计
  • 位置传感器
    这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。

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

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

传感器简介

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

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

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

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    

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

List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);    

如果想列出特定类型的所有传感器,可以使用其他常量来代替 TYPE_ALL,例如 TYPE_GYROSCOPETYPE_LINEAR_ACCELERATIONTYPE_GRAVITY

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

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.
}

监控传感器事件

要监控原始传感器数据,您需要实现两个通过 SensorEventListener 接口公开的回调方法:onAccuracyChanged()onSensorChanged()。Android 系统会在发生以下情况时调用这两个方法:

  • 传感器的准确度发生了变化
    在这种情况下,系统会调用 onAccuracyChanged() 方法,为您提供对于发生变化的 Sensor 对象的引用以及传感器的新准确度。准确度由以下 4 个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUMSENSOR_STATUS_ACCURACY_HIGHSENSOR_STATUS_UNRELIABLE
  • 传感器报告了新值
    在这种情况下,系统会调用 onSensorChanged() 方法,为您提供 SensorEvent 对象。SensorEvent 对象包含关于新传感器数据的信息,包括:数据的准确度、生成数据的传感器、生成数据的时间戳以及传感器记录的新数据。

以下代码展示了如何使用 onSensorChanged() 方法监控光传感器的数据。在本示例中,原始传感器数据作为 sensor_data 显示在 main.xml 文件中定义的 TextView 中。

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

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

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

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

    @Override
    public final void onSensorChanged(SensorEvent event) {
        // The light sensor returns a single value.
        // Many sensors return 3 values, one for each axis.
        float lux = event.values[0];
        // Do something with this sensor value.
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }
}

在本示例中,在调用 registerListener() 方法时指定了默认数据延迟 (SENSOR_DELAY_NORMAL)。数据延迟(或采样率)控制传感器事件通过 onSensorChanged() 回调方法发送到应用的时间间隔。默认数据延迟采用 200,000 微秒的延迟,适用于监控典型的屏幕方向变化。可以指定其他数据延迟,比如 SENSOR_DELAY_GAME(延迟 20,000 微秒)、SENSOR_DELAY_UI(延迟 60,000 微秒),或 SENSOR_DELAY_FASTEST(延迟 0 微秒)。

指定的延迟只是建议的延迟。Android 系统和其他应用可以更改此延迟。最佳做法是指定尽可能大的延迟,因为系统通常会使用比指定的延迟更小的延迟(也就是说,应该选择能够满足应用需求的最低采样率)。使用更大的延迟可以降低处理器的负载,从而降低功耗。

采样率(延迟)一旦设置,就不应该再更改。如果由于某种原因确实需要更改延迟,则必须取消注册再重新注册传感器监听器。

另外还需要注意的是,本示例使用 onResume()onPause() 回调方法来注册和取消注册传感器事件监听器。最佳的做法是始终停用不需要的传感器,特别是在活动处于暂停状态时。如果不这样做,可能会在几小时内将电池电量耗尽,因为有些传感器的电量需求很大,可以很快耗尽电池电量。当屏幕关闭时,系统不会自动停用传感器。

处理不同的传感器配置

Android 没有为设备指定标准的传感器配置,这意味着设备制造商可以在其 Android 设备中采用任何想要的传感器配置。因此,设备可以包含采用各种配置的各种传感器。如果您的应用依赖于特定类型的传感器,则必须确保设备上存在该传感器,这样您的应用才能成功运行。

有两种方法可以确保设备上存在特定的传感器:

  • 在运行时检测传感器,并根据需要启用或停用应用功能。
  • 使用 Google Play 过滤器定位具有特定传感器配置的设备。

在运行时检测传感器

如果应用使用特定类型的传感器,但不依赖于它,则可以使用传感器框架在运行时检测传感器,然后根据需要停用或启用应用功能。例如,导航应用可能会使用温度传感器、压力传感器、GPS 传感器和地磁场传感器来显示温度、气压、位置和罗盘方位。如果设备没有压力传感器,可以使用传感器框架在运行时检测压力传感器的缺失,然后停用应用界面中显示压力的部分。例如,以下代码会检查设备上是否有压力传感器:

private SensorManager sensorManager;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
    // Success! There's a pressure sensor.
} else {
    // Failure! No pressure sensor.
}

使用 Google Play 过滤器定位特定的传感器配置

如果要在 Google Play 上发布应用,您可以在清单文件中使用 <uses-feature> 元素,以对不具备适合应用的传感器配置的设备屏蔽您的应用。<uses-feature> 元素有几个硬件描述符,可根据是否存在特定传感器来过滤应用。可以列出的传感器包括:加速度计、气压计、罗盘(地磁场)、陀螺仪、光传感器和距离传感器。以下清单示例条目会对没有加速度计的设备屏蔽应用:

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
    

如果将此元素和描述符添加到应用的清单中,那么只有当用户的设备具有加速度计时,他们才会在 Google Play 上看到这个应用。

仅当应用完全依赖于特定传感器时,才应将描述符设置为 android:required="true"。如果应用使用某种传感器来实现某项功能,但没有该传感器也可以运行,那么就应该在 <uses-feature> 元素中列出该传感器,但将描述符设置为 android:required="false"。这样可以确保设备即使没有该传感器也可以安装这个应用。这也是帮助跟踪应用所使用的功能的最佳项目管理方法。请记住,如果应用使用特定的传感器,但没有该传感器也能运行,那么就应该在运行时检测传感器,并根据需要停用或启用应用功能。

传感器坐标系

通常,传感器框架使用标准的 3 轴坐标系来表示数据值。对于大多数传感器,当设备处于默认屏幕方向时,会相对于设备屏幕来定义坐标系。当设备处于默认屏幕方向时,X 轴为水平向右延伸,Y 轴为垂直向上延伸,Z 轴为垂直于屏幕向外延伸。在此坐标系中,屏幕后面的坐标将具有负 Z 值。以下传感器使用此坐标系:加速度传感器,重力传感器,陀螺仪,线性加速度传感器,地磁场传感器。
在这里插入图片描述
关于此坐标系,特别需要注意的一点就是当设备的屏幕方向改变时,坐标轴不会转换,也就是说,传感器的坐标系不会随着设备的移动而改变。此行为与 OpenGL 坐标系的行为是相同的。

还需要注意的一点是,应用不能假设设备的自然(默认)屏幕方向是竖屏。许多平板设备的自然屏幕方向为横屏。传感器坐标系始终基于设备的自然屏幕方向。

最后,如果应用将传感器数据对应到屏幕显示,需要使用 getRotation() 方法确定屏幕的旋转度,然后使用 remapCoordinateSystem() 方法将传感器坐标映射到屏幕坐标。即使清单指定了仅限竖屏显示,也需要这样做。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch的 Dataset 的使用

此案例教我们加载并处理TorchVision的FashionMNIST Dataset。 root 目录是 train/test data 存储的地方 downloadTrue 如果root目录没有&#xff0c;则从网上下载 transform and target_transform specify the feature and label transformations import torch from torch.u…

第十五讲:神州交换机端口安全配置

知识点&#xff1a; 开启端口安全模式&#xff1b;设置端口最大安全数&#xff1b;端口绑定MAC地址&#xff1b;违规处理&#xff1b;锁定安全端口&#xff1b;MAC地址与IP的绑定&#xff1b;端口镜像。 实验拓扑如下图所示 PC机 IP地址 掩码 MAC地址 端口 PC1 192.168.…

Windows10安装ubuntu(WSL2,可直接调用Win10程序) —2022年笔记

算是wsl2的使用总结。 一。启动win10虚拟机模块 1. 打开控制面板&#xff08;或开始->运行: control&#xff09; 2. 点击最左边的 “启用或关闭windows功能”&#xff0c;会弹出模块勾选界面 3. 勾上 Hyper-V、适用于Linux的Windows子系统、虚拟机平台 4. 点击确定按钮即开…

【微服务】Nacos 注册中心的设计原理

目录 一、前言 二、数据模型 三、数据一致性 四、负载均衡 五、健康检查 六、性能与容量 七、易用性 八、集群扩展性 九、用户扩展性 十、结尾 &#x1f496; Spring家族及微服务系列文章 一、前言 服务发现是⼀个古老的话题&#xff0c;当应用开始脱离单机运行和访…

Mysql查询性能优化

Mysql查询性能优化0.前言1.为什么查询速度会慢2. 慢查询基础&#xff1a;优化数据访问2.1 是否向数据库请求了不需要的数据2.2 MYSQL是否在扫描额外的记录响应时间扫描的行数和返回的行数3. 重构查询方式3.1 一个复杂查询还是多个简单查询3.2 切分查询3.3 分解关联查询0.前言 …

DAG任务调度系统 Taier 演进之道,探究DataSourceX 模块

熟悉Taier的小伙伴们应该都知道&#xff0c;在11月7日发布的Taier1.3新版本中&#xff0c;我们融合了「DataSourceX 模块」。这是十分重要的一个变化&#xff0c;移除Taier外部插件依赖&#xff0c;新增数据源插件相关特性&#xff0c;支持后续Taier对接更多的RDBMS类型的SQL任…

小鹅通六周年:新知识服务时代,做好企业的“共享CTO”

2022年&#xff0c;产业数字化汹涌而来&#xff0c;驱动企业变革转型的同时&#xff0c;知识也以新的形式出现在各行各业。人人表达和传递知识&#xff0c;知识服务开始进入“下半场”。 如何应用数字化产品满足个人和组织的知识表达需求&#xff1f;作为知识产品与用户服务的…

HashMap的结构,1.7和1.8有哪些区别

一、真实面试题之&#xff1a;Hashmap的结构&#xff0c;1.7和1.8有哪些区别 不同点&#xff1a; &#xff08;1&#xff09;JDK1.7用的是头插法&#xff0c;而JDK1.8及之后使用的都是尾插法&#xff0c;那么他们为什么要这样做呢&#xff1f;因为JDK1.7是用单链表进行的纵向…

【开源项目】单点登录框架XXL-SSO源码解析

单点登录框架XXL-SSO源码解析 项目介绍 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持、WebAPP均支持"等特性。现已开放源代码&#xff0c;开箱即用。 项目地址 https://g…

GRAPH ATTENTION NETWORKS 论文/GAT学习笔记

背景 目标&#xff1a;适用不同结构的图的模型 图卷积 基于谱的方法 &#xff1a; 这些方法学习得到的filters基于拉普拉斯特征基&#xff0c;而拉普拉斯特征基又基于图结构&#xff0c;所以在特定结构上训练的模型不能直接应用到具有不同结构的图。代表&#xff1a;GCN 不基…

分布式系统下的认证与授权

在软件系统设计中&#xff0c;如何让应用能够在各种环境中安全高效的访问是个复杂的问题&#xff0c;这个问题的背后是一系列软件设计时需要考虑的架构安全问题&#xff1a;架构安全性 | 凤凰架构 认证&#xff1a;系统如何识别合法用户&#xff0c;也就是解决 你是谁 的问题&…

2022年全球气候金融产品研究报告

第一章 全球气候金融概述 气候变化既是环境问题也是发展问题&#xff0c;需要大量气候资金的投入&#xff0c;金融作为推动经济发展的核心要素&#xff0c;在应对天气变化中能够发挥重要作用。气候金融是与应对气候变化相关的创新金融&#xff0c;是利用多渠道资金来源、运用多…

redhat9安装卸载mysql

文章目录一.仓库安装1.1、下载rpm包1.2、挂载1.3、安装mysql1.4、启动mysql服务1.5、查看临时密码1.6、登录mysql二.本地安装2.1、复制链接2.2、下载解压2.3、安装需要的包2.4、启动服务2.5、登录mysql三.容器安装3.1、安装docker3.2、run镜像3.3、登录mysql四.源码安装4.1、复…

STM32MP157驱动开发——多点电容触摸屏驱动

STM32MP157驱动开发——多点电容触摸屏驱动一、简介二、电容触摸屏驱动框架简介多点触摸(MT)协议详解三、驱动开发1.添加 FT5426 设备节点2.FT5426 节点配置3.驱动编写4.运行测试5.将驱动添加到内核中1&#xff09;将驱动文件放到合适的位置2&#xff09;修改Makefile6.tslib 移…

Xillinx的设计约束阅读整理

《适用于FPGA和SOC的UlteraFast设计方法指南》&#xff08;UG949&#xff09; 《Vivado Design Suite 用户指南&#xff1a;设计分析与收敛技巧》(UG906) 《Vivado Design Suite 用户指南&#xff1a;使用约束》(UG903) 《Vivado Design Suite Tcl 命令参考指南》(UG835) 约束文…

【java基础】关于线程的一些基础知识点

1.线程的概念&#xff1a; 在java的应用中&#xff0c;线程更多情况下指的是Thread&#xff0c;更精细一点&#xff0c;执行线程就是执行Thread实体下面的run方法&#xff0c;java通过cpu调试&#xff0c;交替进行这些thread&#xff0c;就达到了共同进行这种效果&#xff1b;…

【尚硅谷】SpringBoot2核心技术-1-基础入门

【尚硅谷】SpringBoot2核心技术-1-基础入门一、Spring与SpringBoot1、Spring能做什么1.1、Spring的能力1.2、Spring的生态【没写完】二、SpringBoot2入门1、系统要求1.1、maven设置2、HelloWorld2.1、创建maven工程2.2、引入依赖2.3、创建主程序2.4、编写业务2.5、测试2.6、简化…

DM8开发技能

DM8开发技能 基础学习笔记005 文章目录DM8开发技能1、DMSQL程序设计1.1 概念1.2 数据类型1.3 程序定义1.3.1 存储过程1.3.2 存储函数1.3.3 客户端DMSQL程序1.3.4 参数1.3.5 控制结构&#xff08;1&#xff09;顺序结构&#xff08;2&#xff09;分支结构&#xff08;3&#xf…

Doo Prime 德璞资本:道琼斯期货投资前必看的入门知识

美国道琼工业指数是全球最受关注的股指之一&#xff0c;而道琼斯期货则是典型的衍生性金融商品&#xff0c;交易的标的是道琼指数本身&#xff0c;属于期货投资的范畴&#xff0c;适合短线进出、波段交易。想要参与美国的期货投资市场&#xff0c;却不知道期货该如何开始吗&…

C# XPath的概念

一 XPath的概念 1 XPath是对XML进行查询的表达式 ① Axes(路径) / 及 //; ② 第几个子节点[1] 等&#xff1b; ③ 属性 ④ 条件 [] ⑤ 例如 /books/book/title //price para[type“warning”][5] 2 使用XPath ① XmlDocument docnew XmlDocument(); ② doc.LoadXml(strXml)…