当前位置:   article > 正文

HarmonyOS学习路之开发篇—设备管理(传感器开发)_鸿蒙获取加速度传感器

鸿蒙获取加速度传感器

传感器开发概述

基本概念

HarmonyOS传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor API,可以查询设备上的传感器,订阅传感器的数据,并根据传感器数据定制相应的算法,开发各类应用,比如指南针、运动健康、游戏等。

根据传感器的用途,可以将传感器分为六大类:运动类传感器、环境类传感器、方向类传感器、光线类传感器、健康类传感器、其他类传感器(如霍尔传感器),每一大类传感器包含不同类型的传感器,某种类型的传感器可能是单一的物理传感器,也可能是由多个物理传感器复合而成。

表1 传感器列表

分类

API类名

传感器类型

中文描述

说明

主要用途

运动类

ohos.sensor.agent.CategoryMotionAgent

SENSOR_TYPE_ACCELEROMETER

加速度传感器

测量三个物理轴(x、y 和 z)上,施加在设备上的加速度(包括重力加速度),单位 : m/s2

检测运动状态

SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED

未校准加速度传感器

测量三个物理轴(x、y 和 z)上,施加在设备上的未校准的加速度(包括重力加速度),单位 : m/s2

检测加速度偏差估值

SENSOR_TYPE_LINEAR_ACCELERATION

线性加速度传感器

测量三个物理轴(x、y 和 z)上,施加在设备上的线性加速度(不包括重力加速度),单位 : m/s2

检测每个单轴方向上的线性加速度

SENSOR_TYPE_GRAVITY

重力传感器

测量三个物理轴(x、y 和 z)上,施加在设备上的重力加速度,单位 : m/s2

测量重力大小

SENSOR_TYPE_GYROSCOPE

陀螺仪传感器

测量三个物理轴(x、y 和 z)上,设备的旋转角速度,单位 : rad/s

测量旋转的角速度

SENSOR_TYPE_GYROSCOPE_UNCALIBRATED

未校准陀螺仪传感器

测量三个物理轴(x、y 和 z)上,设备的未校准旋转角速度,单位 : rad/s

测量旋转的角速度及偏差估值

SENSOR_TYPE_SIGNIFICANT_MOTION

大幅度动作传感器

测量三个物理轴(x、y 和 z)上,设备是否存在大幅度运动;如果取值为1则代表存在大幅度运动,取值为0则代表没有大幅度运动

用于检测设备是否存在大幅度运动

SENSOR_TYPE_DROP_DETECTION

跌落检测传感器

检测设备的跌落状态;如果取值为1则代表发生跌落,取值为0则代表没有发生跌落

用于检测设备是否发生了跌落

SENSOR_TYPE_PEDOMETER_DETECTION

计步器检测传感器

检测用户的计步动作;如果取值为1则代表用户产生了计步行走的动作;取值为0则代表用户没有发生运动

用于检测用户是否有计步的动作

SENSOR_TYPE_PEDOMETER

计步器传感器

统计用户的行走步数

用于提供用户行走的步数数据

环境类

ohos.sensor.agent.CategoryEnvironmentAgent

SENSOR_TYPE_AMBIENT_TEMPERATURE

环境温度传感器

测量环境温度,单位 : 摄氏度 (°C)

测量环境温度

SENSOR_TYPE_MAGNETIC_FIELD

磁场传感器

测量三个物理轴向(x、y、z)上,环境地磁场,单位 : μT

创建指南针

SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED

未校准磁场传感器

测量三个物理轴向(x、y、z)上,未校准环境地磁场,单位 : μT

测量地磁偏差估值

SENSOR_TYPE_HUMIDITY

湿度传感器

测量环境的相对湿度,以百分比 (%) 表示

监测露点、绝对湿度和相对湿度

SENSOR_TYPE_BAROMETER

气压计传感器

测量环境气压,单位 : hPa 或 mbar

测量环境气压

SENSOR_TYPE_SAR

比吸收率传感器

测量比吸收率,单位:W/kg

测量设备的电磁波能量吸收比值。

方向类

ohos.sensor.agent.CategoryOrientationAgent

SENSOR_TYPE_6DOF

6自由度传感器

测量上下、前后、左右方向上的位移,单位:m或mm;测量俯仰、偏摆、翻滚的角度,单位:rad

检测设备的三个平移自由度以及旋转自由度,用于目标定位追踪,如:VR

SENSOR_TYPE_SCREEN_ROTATION

屏幕旋转传感器

检测设备屏幕的旋转状态

用于检测设备屏幕是否发生了旋转

SENSOR_TYPE_DEVICE_ORIENTATION

设备方向传感器

测量设备的旋转方向,单位:rad

用于检测设备旋转方向的角度值

SENSOR_TYPE_ORIENTATION

方向传感器

测量设备围绕所有三个物理轴(x、y、z)旋转的角度值,单位:rad

用于提供屏幕旋转的3个角度值

SENSOR_TYPE_ROTATION_VECTOR

旋转矢量传感器

测量设备旋转矢量,复合传感器:由加速度传感器、磁场传感器、陀螺仪传感器合成

检测设备相对于东北天坐标系的方向

SENSOR_TYPE_GAME_ROTATION_VECTOR

游戏旋转矢量传感器

测量设备游戏旋转矢量,复合传感器:由加速度传感器、陀螺仪传感器合成

应用于游戏场景

SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR

地磁旋转矢量传感器

测量设备地磁旋转矢量,复合传感器:由加速度传感器、磁场传感器合成

用于测量地磁旋转矢量

光线类

ohos.sensor.agent.CategoryLightAgent

SENSOR_TYPE_PROXIMITY

接近光传感器

测量可见物体相对于设备显示屏的接近或远离状态

通话中设备相对人的位置

SENSOR_TYPE_TOF

ToF传感器

测量光在介质中行进一段距离所需的时间

识别人像

SENSOR_TYPE_AMBIENT_LIGHT

环境光传感器

测量设备周围光线强度,单位:lux

自动调节屏幕亮度,检测屏幕上方是否有遮挡

SENSOR_TYPE_COLOR_TEMPERATURE

色温传感器

测量环境中的色温

应用于设备的影像处理

SENSOR_TYPE_COLOR_RGB

RGB颜色传感器

测量环境中的RGB颜色值

通过三原色的反射比率实现颜色检测

SENSOR_TYPE_COLOR_XYZ

XYZ颜色传感器

测量环境中的XYZ颜色值

用于辨识真色色点,还原色彩更真实

健康类

ohos.sensor.agent.CategoryBodyAgent

SENSOR_TYPE_HEART_RATE

心率传感器

测量用户的心率数值

用于提供用户的心率健康数据

SENSOR_TYPE_WEAR_DETECTION

佩戴检测传感器

检测用户是否佩戴

用于检测用户是否佩戴智能穿戴

其他类

ohos.sensor.agent.CategoryOtherAgent

SENSOR_TYPE_HALL

霍尔传感器

测量设备周围是否存在磁力吸引

设备的皮套模式

SENSOR_TYPE_GRIP_DETECTOR

手握检测传感器

检测设备是否有抓力施加

用于检查设备侧边是否被手握住

SENSOR_TYPE_MAGNET_BRACKET

磁铁支架传感器

检测设备是否被磁吸

检测设备是否位于车内或者室内

SENSOR_TYPE_PRESSURE_DETECTOR

按压检测传感器

检测设备是否有压力施加

用于检测设备的正上方是否存在按压

运作机制

HarmonyOS传感器包含如下四个模块:Sensor API、Sensor Framework、Sensor Service、HD_IDL层。

图1 HarmonyOS传感器

 

  • Sensor API:提供传感器的基础API,主要包含查询传感器的列表、订阅/取消传感器的数据、执行控制命令等,简化应用开发。
  • Sensor Framework:主要实现传感器的订阅管理,数据通道的创建、销毁、订阅与取消订阅,实现与SensorService的通信。
  • Sensor Service:主要实现HD_IDL层数据接收、解析、分发,前后台的策略管控,对该设备Sensor的管理,Sensor权限管控等。
  • HD_IDL层:对不同的FIFO、频率进行策略选择,以及对不同设备的适配。

约束与限制

  1. 针对某些传感器,开发者需要请求相应的权限,才能获取到相应传感器的数据。
    表2 传感器权限列表

    传感器

    权限名

    敏感级别

    权限描述

    加速度传感器、加速度未校准传感器、线性加速度传感器

    ohos.permission.ACCELEROMETER

    system_grant

    允许订阅Motion组对应的加速度传感器的数据

    陀螺仪传感器、陀螺仪未校准传感器

    ohos.permission.GYROSCOPE

    system_grant

    允许订阅Motion组对应的陀螺仪传感器的数据

    计步器

    ohos.permission.ACTIVITY_MOTION

    user_grant

    允许订阅运动状态

    心率

    ohos.permission.READ_HEALTH_DATA

    user_grant

    允许读取健康数据

  2. 传感器数据订阅和取消订阅接口成对调用,当不再需要订阅传感器数据时,开发者需要调用取消订阅接口进行资源释放。

传感器开发

场景介绍

  • 通过方向传感器数据,可以感知用户设备当前的朝向,从而达到为用户指明方位的目的。
  • 通过重力和陀螺仪传感器数据,能感知设备倾斜和旋转量,提高用户在游戏场景中的体验。
  • 通过接近光传感器数据,感知距离遮挡物的距离,使设备能够自动亮灭屏,达到防误触目的。
  • 通过气压计传感器数据,可以准确的判断设备当前所处的海拔。
  • 通过环境光传感器数据,设备能够实现背光自动调节。
  • 通过霍尔传感器数据,设备可以实现皮套功能等。

接口说明

HarmonyOS传感器提供的功能有:查询传感器的列表、订阅/取消订阅传感器数据、查询传感器的最小采样时间间隔、执行控制命令。

以订阅方向类别的传感器数据为例,本节示例涉及的接口如下:

表1 CategoryOrientationAgent的主要接口

接口名

描述

getAllSensors()

获取属于方向类别的传感器列表。

getAllSensors(int)

获取属于方向类别中特定类型的传感器列表。

getSingleSensor(int)

查询方向类别中特定类型的默认sensor(如果存在多个则返回第一个)。

setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long)

以设定的采样间隔订阅给定传感器的数据。

setSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation, long, long)

以设定的采样间隔和时延订阅给定传感器的数据。

releaseSensorDataCallback(ICategoryOrientationDataCallback, CategoryOrientation)

取消订阅指定传感器的数据。

releaseSensorDataCallback(ICategoryOrientationDataCallback)

取消订阅的所有传感器数据。

表2 SensorAgent的主要接口

接口名

描述

getSensorMinSampleInterval(int)

查询给定传感器的最小采样间隔。

runCommand(int, int, int)

针对某个传感器执行命令,刷新传感器的数据。

表3 CategoryEnvironmentData的主要接口

接口名

描述

getDeviceAltitude(float, float )

根据气压值获取设备所在位置的海拔高度。

GeomagneticField(float, float, float, long)

计算指定地点和时间的磁场。

obtainX()

计算地磁场的北向强度X。

obtainY()

计算地磁场的东向强度Y。

obtainZ()

计算地磁场的垂直向下强度Z。

obtainGeomagneticDip()

计算地磁场的倾斜角。

obtainDeflectionAngle()

计算地磁场的偏角。

obtainLevelIntensity()

计算地磁场的水平分量。

obtainTotalIntensity()

计算地磁场的总强度。

表4 CategoryOrientationData的主要接口

接口名

描述

getDeviceRotationMatrix(float[], float[])

根据旋转矢量获取旋转矩阵。

getDeviceOrientation(float[], float[])

根据旋转矩阵获取设备的方向。

开发步骤

权限配置

如果设备上使用了传感器权限列表中的传感器,需要请求相应的权限,开发者才能获取到传感器数据。

表5 不同敏感级别的传感器举例

敏感级别

传感器

权限名

权限描述

system_grant

加速度传感器、加速度未校准传感器、线性加速度传感器

ohos.permission.ACCELEROMETER

允许订阅Motion组对应的加速度传感器的数据。

user_grant

计步器

ohos.permission.ACTIVITY_MOTION

允许订阅运动状态。

开发者需要在config.json里面配置权限:

  • 开发者如果需要获取加速度的数据,需要进行如下权限配置。
  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.ACCELEROMETER",
  4. "reason": "",
  5. "usedScene": {
  6. "ability": [
  7. ".MainAbility"
  8. ],
  9. "when": "inuse"
  10. }
  11. }
  12. ]
  • 对于需要用户授权的权限,如计步器传感器,需要进行如下权限配置。
  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.ACTIVITY_MOTION",
  4. "reason": "",
  5. "usedScene": {
  6. "ability": [
  7. ".MainAbility"
  8. ],
  9. "when": "inuse"
  10. }
  11. }
  12. ]

由于敏感权限需要用户授权,因此,开发者在应用启动时或者调用订阅数据接口前,需要调用权限检查和请求权限接口。

  1. @Override
  2. public void onStart(Intent intent) {
  3. super.onStart(intent);
  4. if (verifySelfPermission("ohos.permission.ACTIVITY_MOTION") != 0) {
  5. if (canRequestPermission("ohos.permission.ACTIVITY_MOTION")) {
  6. requestPermissionsFromUser(new String[] {"ohos.permission.ACTIVITY_MOTION"}, 1);
  7. }
  8. }
  9. // ...
  10. }
  11. @Override
  12. public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions,
  13. int[] grantResults) {
  14. // 匹配requestPermissionsFromUser的requestCode
  15. if (requestCode == 1) {
  16. if (grantResults.length > 0 && grantResults[0] == 0) {
  17. // 权限被授予
  18. } else {
  19. // 权限被拒绝
  20. }
  21. }
  22. }

使用传感器

以使用方向类别的传感器为例,运动类、环境类、健康类等类别的传感器使用方法类似。

  1. 获取待订阅数据的传感器。
  2. 创建传感器回调。
  3. 订阅传感器数据。
  4. 接收并处理传感器数据。
  5. 取消订阅传感器数据。
  1. private static final long INTERVAL = 100000000L;
  2. private Button btnSubscribe;
  3. private Button btnUnsubscribe;
  4. private CategoryOrientationAgent categoryOrientationAgent = new CategoryOrientationAgent();
  5. private ICategoryOrientationDataCallback orientationDataCallback;
  6. private CategoryOrientation orientationSensor;
  7. private int matrix_length = 9;
  8. private int rotationVectorLength = 9;
  9. @Override
  10. public void onStart(Intent intent) {
  11. super.onStart(intent);
  12. super.setUIContent(ResourceTable.Layout_sensor_layout);
  13. findComponent(rootComponent);
  14. // 创建传感器回调对象。
  15. orientationDataCallback = new ICategoryOrientationDataCallback() {
  16. @Override
  17. public void onSensorDataModified(CategoryOrientationData categoryOrientationData) {
  18. // 对接收的categoryOrientationData传感器数据对象解析和使用
  19. int dim = categoryOrientationData.getSensorDataDim(); // 获取传感器的维度信息
  20. float degree = categoryOrientationData.getValues()[0]; // 获取方向类传感器的第一维数据
  21. float[] rotationMatrix = new float[matrix_length];
  22. CategoryOrientationData.getDeviceRotationMatrix(rotationMatrix, categoryOrientationData.values); // 根据旋转矢量传感器的数据获得旋转矩阵
  23. float[] rotationAngle = new float[rotationVectorLength];
  24. rotationAngle = CategoryOrientationData.getDeviceOrientation(rotationMatrix, rotationAngle); // 根据计算出来的旋转矩阵获取设备的方向
  25. }
  26. @Override
  27. public void onAccuracyDataModified(CategoryOrientation categoryOrientation, int index) {
  28. // 使用变化的精度
  29. }
  30. @Override
  31. public void onCommandCompleted(CategoryOrientation categoryOrientation) {
  32. // 传感器执行命令回调
  33. }
  34. };
  35. btnSubscribe.setClickedListener(v -> {
  36. // 获取传感器对象,并订阅传感器数据
  37. orientationSensor = categoryOrientationAgent.getSingleSensor(
  38. CategoryOrientation.SENSOR_TYPE_ORIENTATION);
  39. if (orientationSensor != null) {
  40. categoryOrientationAgent.setSensorDataCallback(
  41. orientationDataCallback, orientationSensor, INTERVAL);
  42. }
  43. });
  44. // 取消订阅传感器数据
  45. btnUnsubscribe.setClickedListener(v -> {
  46. if (orientationSensor != null) {
  47. categoryOrientationAgent.releaseSensorDataCallback(
  48. orientationDataCallback, orientationSensor);
  49. }
  50. });
  51. }
  52. private void findComponent(Component component) {
  53. btnSubscribe = (Button) component.findComponentById(ResourceTable.Id_btnSubscribe);
  54. btnUnsubscribe = (Button) component.findComponentById(ResourceTable.Id_btnUnsubscribe);
  55. }

另外,CategoryEnvironmentData中地磁场算法相关接口的使用示例如下:

  • 构造指定地点和时间的磁场
  1. long timeMillis = new GregorianCalendar(2020, 1, 1).getTimeInMillis();
  2. CategoryEnvironmentData.GeomagneticField geomagneticField = new CategoryEnvironmentData.GeomagneticField(80, 0, 0, timeMillis);
  • 获取指定地点和时间的磁场数据
  1. float geomagneticX = geomagneticField.obtainX();
  2. float geomagneticY = geomagneticField.obtainY();
  3. float geomagneticZ = geomagneticField.obtainZ();
  4. float deflectionAngle = geomagneticField.obtainDeflectionAngle();
  5. float geomagneticDip = geomagneticField.obtainGeomagneticDip();
  6. float levelIntensity = geomagneticField.obtainLevelIntensity();
  7. float totalIntensity = geomagneticField.obtainTotalIntensity();
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/327530
推荐阅读
相关标签
  

闽ICP备14008679号